Qt / QWidget、QFrame 区别
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 区别相关推荐
- [Qt] QWidget QWindow 窗口管理器(WM)
Widget 和 窗口 Qt中,没有Parent 的 Wiget(QWidget 及其子类) 会自动成为一个窗口,如果一个QButton 没有parent,同样会成为一个窗口: 窗口是由操作系统统一管 ...
- Qt QWidget实现消息提示控件TipsWidget
前言 用Qt实现一个消息提示控件,控件宽度会根据显示的内容多少来动态伸展,控件显示三秒钟过后会自动渐变透明度然后最终消失,这有点类似于Android的Toast控件,都是用于消息短暂提示. 源码 头文 ...
- Qt QWidget实现开关控件SwithButton(SlipButton)
前言 Qt做界面的时候常常会用到开关控件,类似于CheckButton有两种状态,只是界面表现形式不一样而已.本文通过QWidget类来实现一个开关控件SwitchBtn(有些平台上又称为SlipBu ...
- Qt QWidget实现手势缩放和平移(二)
上一篇文章中讲到了QWidget实现手势缩放和平移,通过QGestureEvent来捕捉手势操作,但是这种方式不一定能通用,比如像教学用的电子白板上,是红外触控感应,并不能通过QGestureEven ...
- Qt QWidget实现手势缩放和平移(一)
由于项目要求,需要在QWidget中实现一个手势操作的功能,对图片进行放大/缩小/平移功能,并且还需要支持通过鼠标和键盘来实现该功能.其实这种功能在QGraphicsView中实现比较简单, 不过在Q ...
- Qt::WindowModal和Qt::ApplicationModal的区别
Qt::WindowModal和Qt::ApplicationModal都是弹出模态窗体,但是Qt::WindowModal和Qt::ApplicationModal的模态影响的范围不同. Qt::W ...
- Qt QWidget播放视频背景图片闪烁
播放软件主窗口重新实现函数changeEvent,解决最小化之后界面不刷新问题. void VRS::changeEvent(QEvent * event) {//最小化之后再恢复到之前状态,界面会出 ...
- Qt: QWidget::paintEngine: Should no longer be called
目录 由来 注意下面我的创建过程: 下面是解决方法: 产生这个错误的原因: 由来 今天在QT Creater使用QPainter的时候出现了这个错误,在引用输出窗口还有这么一些错误 之前在使用其他类的 ...
- Qt qwidget嵌入ppt
1. pro : 增加 QT+=axcontainer 2.打开ppt QAxObject *ppt_dsoframer;ppt_dsoframer=new QAxObject(this);boo ...
最新文章
- android 电量控件,Android实现显示电量的控件代码
- wzplayer for android V1.0
- 那些年,我们见过的 Java 服务端“问题”
- 一键安装 redmine on rhel6.4
- 基于单片机的火灾消防系统设计(#0480)
- java经典项目_推荐几个经典的Java开源项目
- 关于路由器的一些认识(有些不够严谨)
- ld: library not found for -l.... 问题的解决
- 雅思-我们遇到过的哪些熟悉又陌生的单词1
- 超级计算机控制人的电影,想知道这部电影的名字,讲述通过超级计算机进入人脑.回到过去.其中有个老教授死亡留下一封信给给主角。...
- 【C#基础】数据结构
- 2016京东java待遇_Java硕士京东工作1年,跳槽后他期望薪资26K,大家感觉他可以吗...
- 录音文件下载_VAA云录音(系统)-VAA云录音下载安装v1.1.9
- I.MX6 FFmpeg 录制视频
- 适合Python菜鸟的爬虫入门课
- 如何查看隐藏的文件夹
- 计算机辅助CAD试题,计算机辅助技术CAD考试试题.doc
- 金融行业的大数据分析
- SAI / PS绘画一个卡通女孩详解
- java启动程序快捷方式_一个快捷打开工具的实现