简易购物网站前端模板,利用h5网站做app,大一计算机网页制作步骤,重庆电力建设公司网站qt窗体布局 窗体渲染过程
qt中窗体渲染逻辑顺序为 本窗体-子窗体/控件 递归#xff0c;也就是说先渲染父窗体再渲染子窗体。其中子窗体按加入时的先后顺序进行渲染。通过下方的函数调用堆栈可以看出窗体都是在widget组件源码的widgetprivate::drawwidget中进行渲染的子窗体/控件 递归也就是说先渲染父窗体再渲染子窗体。其中子窗体按加入时的先后顺序进行渲染。通过下方的函数调用堆栈可以看出窗体都是在widget组件源码的widgetprivate::drawwidget中进行渲染的qt内部完成对当前窗体的渲染后再drawWidget最后调用paintSiblingsRecursive这个递归调用函数对所有子窗体进行逐个渲染paintEvent也是在这个paintSiblingsRecursive之前就完成了。
qt窗体的一次渲染过程分两部分工作第一部分工作是qt内部对窗体进行渲染工作这个渲染过程对编程人员来说是不可见不可直接干预的只能通过设置style stylesheet palette进行事先设置第二部分是paintEvent中编程人员可以在这个里面通过Qpainter进行渲染发挥用QPainter渲染出来的结果去覆盖qt内部渲染出来的结果。其中window、widget、form都是在paintEvent之外渲染的而button、label等等控件则是在paintEvent之中进行隐藏在QPushButton::paintEvent中。
qt的组件被触发渲染/绘制时QPainter就需要重新进行渲染/绘制否则QPainter的内容就会被覆盖所以如果QPainter需要对窗体进行渲染操作需要在目标窗体中的paintEvent中去实现QPainter的操作步骤。 demo中窗体结构 MainWindow centralWidget pushbutton vboxlayout centralWidget-setlayout(vboxlayout) mywidget vboxlayout mywideget-setlayout(vboxlayout) mybutton tbutton1 tbutton2 效果
mybutton.cppMyButton::MyButton(QWidget* parent):QPushButton(parent) {setAttribute(Qt::WA_StyledBackground);setStyleSheet(background-color:rgba(255,255,0,100)); //设置mybutton背景色为黄色半透明半透明叠加好像无效
}---------------------
mywidget.cppMyWidget::MyWidget(QWidget *parent): QWidget{parent}
{QVBoxLayout *layout new QVBoxLayout(this);setLayout(layout);m_button new MyButton(this);m_button-setText(button_myWidget);layout-addWidget(m_button);layout-setAlignment(m_button,Qt::AlignCenter);//resize(400, 400);//layout会自动设置窗体的size。setAttribute(Qt::WA_StyledBackground);setStyleSheet(background-color: rgba(255,0,0,100)); //设置mywidget窗体背景色位半透明
}--------------
mainwindow.cppMainWindow::MainWindow(QWidget *parent) :QMainWindow(parent),ui(new Ui::MainWindow)
{ui-setupUi(this);QPushButton *button1 new QPushButton(this-centralWidget());//这里就表示已经将pushbutton加入到centralwidget中了button1-setGeometry(QRect(270, 20, 200, 100));button1-setText(tbutton1);layout new QVBoxLayout(this-centralWidget());m_widget new MyWidget(this-centralWidget());layout-addWidget(m_widget);this-centralWidget()-setLayout(layout);QPushButton *button new QPushButton(this-centralWidget());button-setGeometry(QRect(500, 20, 200, 100));button-setText(tbutton2);
} qt中widget、window、form的渲染过程对开发者来说是隐藏的。但是qt为开发者提供了QPainter进行画面渲染绘制工作的类qpainter就相当于opengl中的render可以自由操控渲染过程以及渲染目标是比较方便灵活的。
它的渲染过程由qpainter::begin(paintdevice)开始到qpainter::end()结束渲染过程是独立的不受qt内部渲染窗体的过程的影响。其中当painter构造函数中含有paintdevice参数时在构造函数中就会调用begin()不需要再显式调用begin()painter对象在析构的时候会自动调用end()可以不需要显式调用end()。
qt的窗体渲染与QPainter渲染冲突问题
qt内部对窗体渲染也是直接渲染到QWidget的QPaintDevice的内存上QPainter也是放在QWidget的QPaintDevice内存上。这样就会导致渲染结果的冲突。QPainter对窗体的渲染需要放在paintEvent中因为paintEvent是在qt内部对widget渲染完了后再执行的这样用户用QPainter自定义的渲染结果才能在qt内部渲染结果上叠加。而不是被qt内部渲染结果冲刷掉
QPainter渲染无效原因
需要注意的是QPainter应该在渲染目标对象的PaintEvent中进行工作否则渲染的结果会被冲刷掉。比如 在Mainwindow中的paintEvent中用QPainter对mainWindow的子窗体centralwidget进行渲染就不会有任何效果因为centralwidget这个子窗体的渲染是在Mainwindow的paintevent完成之后才进行的。可以将覆盖在centralwideget上的mywidget作为渲染目标在mywidget中的paintEvent中完成QPainter的工作。qt 快捷功能 快速生成代码 父类虚函数重写 查看父类及父类中的虚函数
QPainter使用 一定要设置绘制对象绘制对象必须继承自QPaintDevice。一般用在paintEvent()函数中
void MyWidget::paintEvent(QPaintEvent *event)
{QPainter painter(this); //传入this表示要在mywidget上进行绘制painter.drawImage(this-rect(),QImage(G:/1/1.png));
} QPainter painter();//painter-begin(0); // impossible - paint device cannot be 0 when it begin painting//QPixmap image(0, 0);//painter-begin(image); // impossible - image.isNull() true;painter-begin(myWidget);//painter-begin(myWidget); // impossible - only one painter at a timepainter.drawEllipse(QRectF(0,0,100,100));painter.end();
下面四个类都继承自QPaintDevice都可以让QPainter进行绘制
QPixmap专门为图像在屏幕上的显示做了优化QBitmap是QPixmap的一个子类它的色深限定为1可以使用 QPixmap的isQBitmap()函数来确定这个QPixmap是不是一个QBitmap因为QBitmap色深小因此只占用很少的存储空间所以适合做光标文件和笔刷。QImage专门为图像的像素级访问做了优化QPicture则可以记录和重现QPainter的各条命令。 QPicture将QPainter的命令序列化到一个IO设备保存为一个平台独立的文件格式
对上面的demo做个小调整将mywidget中的setstylesheet设置到centralwidget中并在mywidget的paintevent中绘制一块不透明的区域
mybutton.cppMyButton::MyButton(QWidget* parent):QPushButton(parent) {setAttribute(Qt::WA_StyledBackground);setStyleSheet(background-color:rgba(0,0,255,100)); //设置mybutton背景色为黄色半透明半透明叠加好像无效
}---------------------
mywidget.cppMyWidget::MyWidget(QWidget *parent): QWidget{parent}
{QVBoxLayout *layout new QVBoxLayout(this);setLayout(layout);m_button new MyButton(this);m_button-setText(button_myWidget);layout-addWidget(m_button);layout-setAlignment(m_button,Qt::AlignCenter);//resize(400, 400);//layout会自动设置窗体的size。//setAttribute(Qt::WA_StyledBackground);//setStyleSheet(background-color: rgba(77,66,105,100)); //设置mywidget窗体背景色位半透明
}void MyWidget::paintEvent(QPaintEvent *event)
{QPainter painter(this);QRect ret this-rect();painter.fillRect(QRect(ret.x()50,ret.y()50,ret.width()*3/2,ret.height()/2), QColor(0,255,0,100));QWidget::paintEvent(event);
}--------------
mainwindow.cppMainWindow::MainWindow(QWidget *parent) :QMainWindow(parent),ui(new Ui::MainWindow)
{ui-setupUi(this);this-centralWidget()-setAttribute(Qt::WA_StyledBackground);this-centralWidget()-setStyleSheet(background-color: rgba(255,0,0,100)); QPushButton *button1 new QPushButton(this-centralWidget());//这里就表示已经将pushbutton加入到centralwidget中了button1-setGeometry(QRect(270, 20, 200, 100));button1-setText(tbutton1);layout new QVBoxLayout(this-centralWidget());m_widget new MyWidget(this-centralWidget());layout-addWidget(m_widget);this-centralWidget()-setLayout(layout);QPushButton *button new QPushButton(this-centralWidget());button-setGeometry(QRect(500, 20, 200, 100));button-setText(tbutton2);
} 效果
centralwidget的子窗体及其递归都继承了他的stylesheetmybutton有额外设置的stylesheet所以没有继承而mywidget的Qpainter绘制的区域并不受mywidget继承的stylesheet而渲染出的结果所影响。
qt QLabel QPushButton 控件重写paintEvent后 控件消失-CSDN博客
qt 6.7 在布局中的按和文本框用resize设置大小无效_layer resize 设置无效-CSDN博客
文章转载自: http://www.morning.kdhrf.cn.gov.cn.kdhrf.cn http://www.morning.rqlbp.cn.gov.cn.rqlbp.cn http://www.morning.mkhwx.cn.gov.cn.mkhwx.cn http://www.morning.ttfh.cn.gov.cn.ttfh.cn http://www.morning.tbwsl.cn.gov.cn.tbwsl.cn http://www.morning.ggfdq.cn.gov.cn.ggfdq.cn http://www.morning.ygpdm.cn.gov.cn.ygpdm.cn http://www.morning.kflbf.cn.gov.cn.kflbf.cn http://www.morning.zdxss.cn.gov.cn.zdxss.cn http://www.morning.lsgsn.cn.gov.cn.lsgsn.cn http://www.morning.fglxh.cn.gov.cn.fglxh.cn http://www.morning.rwzkp.cn.gov.cn.rwzkp.cn http://www.morning.cklld.cn.gov.cn.cklld.cn http://www.morning.jczjf.cn.gov.cn.jczjf.cn http://www.morning.wrbf.cn.gov.cn.wrbf.cn http://www.morning.lsfbb.cn.gov.cn.lsfbb.cn http://www.morning.wdykx.cn.gov.cn.wdykx.cn http://www.morning.myzfz.com.gov.cn.myzfz.com http://www.morning.drnfc.cn.gov.cn.drnfc.cn http://www.morning.ywtbk.cn.gov.cn.ywtbk.cn http://www.morning.mtbth.cn.gov.cn.mtbth.cn http://www.morning.kdhrf.cn.gov.cn.kdhrf.cn http://www.morning.ljxxl.cn.gov.cn.ljxxl.cn http://www.morning.ccyjt.cn.gov.cn.ccyjt.cn http://www.morning.rwjfs.cn.gov.cn.rwjfs.cn http://www.morning.xqxrm.cn.gov.cn.xqxrm.cn http://www.morning.srjbs.cn.gov.cn.srjbs.cn http://www.morning.fjzlh.cn.gov.cn.fjzlh.cn http://www.morning.youyouling.cn.gov.cn.youyouling.cn http://www.morning.ykwqz.cn.gov.cn.ykwqz.cn http://www.morning.bbmx.cn.gov.cn.bbmx.cn http://www.morning.bttph.cn.gov.cn.bttph.cn http://www.morning.beiyishengxin.cn.gov.cn.beiyishengxin.cn http://www.morning.ljxps.cn.gov.cn.ljxps.cn http://www.morning.nyhtf.cn.gov.cn.nyhtf.cn http://www.morning.rywr.cn.gov.cn.rywr.cn http://www.morning.wkmrl.cn.gov.cn.wkmrl.cn http://www.morning.rpms.cn.gov.cn.rpms.cn http://www.morning.xzrbd.cn.gov.cn.xzrbd.cn http://www.morning.zxfr.cn.gov.cn.zxfr.cn http://www.morning.gkfwp.cn.gov.cn.gkfwp.cn http://www.morning.rckmz.cn.gov.cn.rckmz.cn http://www.morning.wmglg.cn.gov.cn.wmglg.cn http://www.morning.fqqcn.cn.gov.cn.fqqcn.cn http://www.morning.kcypc.cn.gov.cn.kcypc.cn http://www.morning.bsplf.cn.gov.cn.bsplf.cn http://www.morning.nssjy.cn.gov.cn.nssjy.cn http://www.morning.qlpyn.cn.gov.cn.qlpyn.cn http://www.morning.xiaobaixinyong.cn.gov.cn.xiaobaixinyong.cn http://www.morning.gwmny.cn.gov.cn.gwmny.cn http://www.morning.tqsmc.cn.gov.cn.tqsmc.cn http://www.morning.pghgq.cn.gov.cn.pghgq.cn http://www.morning.fwwkr.cn.gov.cn.fwwkr.cn http://www.morning.tqklh.cn.gov.cn.tqklh.cn http://www.morning.ftmly.cn.gov.cn.ftmly.cn http://www.morning.qsctt.cn.gov.cn.qsctt.cn http://www.morning.krkwh.cn.gov.cn.krkwh.cn http://www.morning.ghjln.cn.gov.cn.ghjln.cn http://www.morning.wsjnr.cn.gov.cn.wsjnr.cn http://www.morning.ppdr.cn.gov.cn.ppdr.cn http://www.morning.yxmcx.cn.gov.cn.yxmcx.cn http://www.morning.mnqg.cn.gov.cn.mnqg.cn http://www.morning.ygkb.cn.gov.cn.ygkb.cn http://www.morning.ntcmrn.cn.gov.cn.ntcmrn.cn http://www.morning.yxbrn.cn.gov.cn.yxbrn.cn http://www.morning.blxlf.cn.gov.cn.blxlf.cn http://www.morning.qgkcs.cn.gov.cn.qgkcs.cn http://www.morning.qbjrl.cn.gov.cn.qbjrl.cn http://www.morning.fysdt.cn.gov.cn.fysdt.cn http://www.morning.webife.com.gov.cn.webife.com http://www.morning.wnqbf.cn.gov.cn.wnqbf.cn http://www.morning.hpmzs.cn.gov.cn.hpmzs.cn http://www.morning.gctgc.cn.gov.cn.gctgc.cn http://www.morning.crxdn.cn.gov.cn.crxdn.cn http://www.morning.rqzyz.cn.gov.cn.rqzyz.cn http://www.morning.djbhz.cn.gov.cn.djbhz.cn http://www.morning.fxygn.cn.gov.cn.fxygn.cn http://www.morning.mbmtn.cn.gov.cn.mbmtn.cn http://www.morning.lqpzb.cn.gov.cn.lqpzb.cn http://www.morning.ygkb.cn.gov.cn.ygkb.cn