QFrame 是基本控件的基类,QWidget 是 QFrame 基类,关系如下:

QWidget <- QFrame <- QPushButton,QLabel…

我们经常会从 QFrame 或者 QWidget 继承然后自定义一个复杂的 widget,在设置样式表的时候它们就有一个大的区别。

dialog.h

#ifndef DIALOG_H
#define DIALOG_H#include <QDialog>
#include <QFrame>
#include <QStyleOption>
#include <QStyle>
#include <QPainter>namespace Ui {
class Dialog;
}class MyWidget : public QWidget {Q_OBJECT
public:MyWidget(QWidget *parent = 0) : QWidget(parent) {this->setStyleSheet("QWidget{background:#ff0000;} QWidget:hover{background:#00ff00;}");}//protected:
//    virtual void paintEvent(QPaintEvent *event) override
//    {
//        Q_UNUSED(event);
//        QStyleOption opt;
//        opt.init(this);
//        QPainter p(this);
//        style()->drawPrimitive(QStyle::PE_Widget, &opt, &p, this);
//    }
};class MyFrame : public QFrame {Q_OBJECT
public:MyFrame(QWidget *parent = 0) : QFrame(parent) {this->setStyleSheet("QWidget{background:#ff0000;} QWidget:hover{background:#00ff00;}");}
};class Dialog : public QDialog
{Q_OBJECTpublic:explicit Dialog(QWidget *parent = 0);~Dialog();private:Ui::Dialog *ui;
};#endif // DIALOG_H

dialog.cpp

#include "dialog.h"
#include "ui_dialog.h"Dialog::Dialog(QWidget *parent) :QDialog(parent),ui(new Ui::Dialog)
{ui->setupUi(this);setFixedSize(QSize(400,300));MyWidget *widget = new MyWidget(this);MyFrame *frame = new MyFrame(this);widget->setFixedSize(50, 50);frame->setFixedSize(50, 50);widget->move(0, 0);frame->move(0, 50);
}Dialog::~Dialog()
{delete ui;
}

如下图,发现从 QWidget 继承过来的 MyWidget 并没有显示出样式来。

具体原因还不是很清楚,不过下面一段话可能对我们有些帮助:

QWidget Supports only the background, background-clip and background-origin properties.

If you subclass from QWidget, you need to provide a paintEvent for your custom QWidget as below:

void CustomWidget::paintEvent(QPaintEvent *)
{QStyleOption opt;opt.init(this);QPainter p(this);style()->drawPrimitive(QStyle::PE_Widget, &opt, &p, this);
}

The above code is a no-operation if there is no stylesheet set.

Warning: Make sure you define the Q_OBJECT macro for your custom widget。

转载于:QFrame与QWidget的区别_Keep It Simple, Stupid-CSDN博客

(SAW:Game Over!)

Qt / QWidget、QFrame 区别相关推荐

  1. [Qt] QWidget QWindow 窗口管理器(WM)

    Widget 和 窗口 Qt中,没有Parent 的 Wiget(QWidget 及其子类) 会自动成为一个窗口,如果一个QButton 没有parent,同样会成为一个窗口: 窗口是由操作系统统一管 ...

  2. Qt QWidget实现消息提示控件TipsWidget

    前言 用Qt实现一个消息提示控件,控件宽度会根据显示的内容多少来动态伸展,控件显示三秒钟过后会自动渐变透明度然后最终消失,这有点类似于Android的Toast控件,都是用于消息短暂提示. 源码 头文 ...

  3. Qt QWidget实现开关控件SwithButton(SlipButton)

    前言 Qt做界面的时候常常会用到开关控件,类似于CheckButton有两种状态,只是界面表现形式不一样而已.本文通过QWidget类来实现一个开关控件SwitchBtn(有些平台上又称为SlipBu ...

  4. Qt QWidget实现手势缩放和平移(二)

    上一篇文章中讲到了QWidget实现手势缩放和平移,通过QGestureEvent来捕捉手势操作,但是这种方式不一定能通用,比如像教学用的电子白板上,是红外触控感应,并不能通过QGestureEven ...

  5. Qt QWidget实现手势缩放和平移(一)

    由于项目要求,需要在QWidget中实现一个手势操作的功能,对图片进行放大/缩小/平移功能,并且还需要支持通过鼠标和键盘来实现该功能.其实这种功能在QGraphicsView中实现比较简单, 不过在Q ...

  6. Qt::WindowModal和Qt::ApplicationModal的区别

    Qt::WindowModal和Qt::ApplicationModal都是弹出模态窗体,但是Qt::WindowModal和Qt::ApplicationModal的模态影响的范围不同. Qt::W ...

  7. Qt QWidget播放视频背景图片闪烁

    播放软件主窗口重新实现函数changeEvent,解决最小化之后界面不刷新问题. void VRS::changeEvent(QEvent * event) {//最小化之后再恢复到之前状态,界面会出 ...

  8. Qt: QWidget::paintEngine: Should no longer be called

    目录 由来 注意下面我的创建过程: 下面是解决方法: 产生这个错误的原因: 由来 今天在QT Creater使用QPainter的时候出现了这个错误,在引用输出窗口还有这么一些错误 之前在使用其他类的 ...

  9. Qt qwidget嵌入ppt

    1. pro :  增加  QT+=axcontainer 2.打开ppt QAxObject *ppt_dsoframer;ppt_dsoframer=new QAxObject(this);boo ...

最新文章

  1. android 电量控件,Android实现显示电量的控件代码
  2. wzplayer for android V1.0
  3. 那些年,我们见过的 Java 服务端“问题”
  4. 一键安装 redmine on rhel6.4
  5. 基于单片机的火灾消防系统设计(#0480)
  6. java经典项目_推荐几个经典的Java开源项目
  7. 关于路由器的一些认识(有些不够严谨)
  8. ld: library not found for -l.... 问题的解决
  9. 雅思-我们遇到过的哪些熟悉又陌生的单词1
  10. 超级计算机控制人的电影,想知道这部电影的名字,讲述通过超级计算机进入人脑.回到过去.其中有个老教授死亡留下一封信给给主角。...
  11. 【C#基础】数据结构
  12. 2016京东java待遇_Java硕士京东工作1年,跳槽后他期望薪资26K,大家感觉他可以吗...
  13. 录音文件下载_VAA云录音(系统)-VAA云录音下载安装v1.1.9
  14. I.MX6 FFmpeg 录制视频
  15. 适合Python菜鸟的爬虫入门课
  16. 如何查看隐藏的文件夹
  17. 计算机辅助CAD试题,计算机辅助技术CAD考试试题.doc
  18. 金融行业的大数据分析
  19. SAI / PS绘画一个卡通女孩详解
  20. java启动程序快捷方式_一个快捷打开工具的实现

热门文章

  1. 使内嵌式jetty服务器支持jsp
  2. Linux学习笔记6
  3. 关于ubuntu中的inittab文件
  4. HTML5+PhoneGap相机拍照
  5. CLR via C# 3 读书笔记(2):第1章 CLR执行模型 — 1.2 将托管模块组合为程序集
  6. 如何修复修复损坏的TAU G2的.u2文件
  7. 2020 操作系统第二次习题
  8. Celery简介及Docker测试环境搭建
  9. CentOS7升级Git版本
  10. spark rdd reduceByKey示例