qt整个窗口上绘制矩形与在窗口的子控件上绘制矩形
引言
創建一個基于QDialog的項目,自動生成ui文件,此時再添加新文件,創建一個基于QWidget的ui類,此類具有自定義標題欄,讓該自定義類顯示在窗口Dialog上,一開始具有紅色的邊框線,且四角圍繞四個矩形,點擊中間的自定義窗口時,窗口的邊框線由黃色實線變為藍色實線,再點擊變為紅色虛線,再點擊變為藍色實現,再點擊紅色虛線等等。此類是為了區分在整個窗口上繪制矩形與在窗口的子控件上繪制矩形的不同。
效果
以上就可以實現下面的效果:
程序剛開始運行:
點擊中間的窗口后:
再點擊后的效果:
項目的結構:
示例
下面是上述示例的代碼。創建基于QDialog的項目,不去掉ui文件,自動生成ui文件,然后添加新文件基于QWidget類,在生成的QWidget類的ui文件中拖入其它控件,QWidget類的ui文件結構如下圖:
除了widget_3控件柵格布局的上下左右邊框設置了邊距,所有布局之間的距離都為0。
ui文件如下:
當然上謎案直接設置了控件widget,widget_2以及label的樣式。
下面是完整的代碼:
自定義窗口類的代碼。
form.h
form.cpp
#include "form.h" #include "ui_form.h" #include <QPainter> #include <QPen> #include <QMouseEvent>Form::Form(QWidget *parent) :QWidget(parent),ui(new Ui::Form) {ui->setupUi(this);m_isNudge = false;m_isPress = false;ui->widget_3->installEventFilter(this);//安裝事件過濾器 }Form::~Form() {delete ui; }bool Form::eventFilter(QObject *watched, QEvent *event) {if (watched == ui->widget_3 && event->type() == QEvent::Paint) {paintBorder(ui->widget_3);//沒有觸發重繪事件,所以畫筆沒有被激活return true;}return false; }void Form::paintBorder(QWidget *widget) {if (!m_isPress) {return ;}QPainter painter(widget);QPen pen;QColor color;if (m_isNudge) {QColor cl(Qt::red);color = cl;pen.setStyle(Qt::DashDotLine);}else {QColor cl(Qt::darkBlue);color = cl;pen.setStyle(Qt::SolidLine);}pen.setColor(color);pen.setWidth(6);painter.setPen(pen);QRect rect = this->rect();painter.setRenderHint(QPainter::Antialiasing);painter.drawRect(rect.x(),rect.y(),rect.width(),rect.height()); }void Form::paintEvent(QPaintEvent *event) {Q_UNUSED(event);QPainter painter(this);QPen pen;pen.setWidth(6);pen.setColor(QColor(Qt::yellow));painter.setPen(pen);painter.drawRect(ui->widget_3->x(),ui->widget_3->y(),ui->widget_3->width(),ui->widget_3->height()); }void Form::mousePressEvent(QMouseEvent *event) {if (event->button() == Qt::LeftButton) {m_isPress = true;if (m_isNudge) {move(geometry().x() + 1,geometry().y() + 1);//通過移動觸發重繪函數m_isNudge = false;}else {move(geometry().x() - 1,geometry().y() - 1);m_isNudge = true;}} }Dialog類的代碼:
dialog.h
dialog,cpp
#include "dialog.h" #include "ui_dialog.h" #include <QPainter> #include <QPen> #include <QLabel>Dialog::Dialog(QWidget *parent): QDialog(parent), ui(new Ui::Dialog) {ui->setupUi(this);initChildControl(); }Dialog::~Dialog() {delete ui; }void Dialog::initChildControl() {m_form = new Form(this);m_form->setGeometry(width() / 4,height() / 4 - 20,m_form->width(),m_form->height());//初始化窗口上四個角上的矩形QRect rect1(2,2,180,180);QRect rect2(width()-182,2,180,180);QRect rect3(2,height()-182,180,180);QRect rect4(width()-182,height()-182,180,180);m_rectVec.append(rect1);m_rectVec.append(rect2);m_rectVec.append(rect3);m_rectVec.append(rect4); }void Dialog::paintEvent(QPaintEvent *event) {QPainter painter(this);QPen pen;pen.setWidth(4);pen.setColor(QColor(85,85,255,255));painter.setPen(pen);painter.drawRects(m_rectVec); }main.cpp
#include "dialog.h"#include <QApplication>int main(int argc, char *argv[]) {QApplication a(argc, argv);Dialog w;w.show();return a.exec(); }總結
在整個窗口上繪制矩形,需要重寫paintEvent函數,在該函數中實現繪制矩形;在窗口的子控件上繪制矩形,需要在改類的構造函數中給該繪圖的子控件安裝事件過濾器,然后重寫事件過濾函數,在該子控件的相應事件下實現繪制矩形。注意安裝事件過濾器。
總結
以上是生活随笔為你收集整理的qt整个窗口上绘制矩形与在窗口的子控件上绘制矩形的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: oracle10gasmcmd,ORAC
- 下一篇: const对象