qt 中允许自定义窗口控件,使之满足特殊要求,
(1)可以修改其显示,自行绘制
(2)可以动态显示
(3)可以添加事件,支持鼠标和键盘操作
自定义控件可以直接在QtDesigner里使用,可以直接加到父窗口里。
绘制窗口
1.新建一个类,继承与QWidget或QFrame,最好是继承于QFrame
2.重写以下函数
void CellMonitor::paintEvent(QPaintEvent *event) { QPainter painter(this) }
3.使用这个类
例子:画一个圆形
void CircleWidget::paintEvent(QPaintEvent *event) { QPainter painter(this); panter.setBrush(QBrush(QColor(0x00,0xFF,0x00))); painter.drawEllipse(QPoint(100,100),100,100); }
circlewidget.h
#ifndef CIRCLAWIDGET_H #define CIRCLAWIDGET_H #include <QFrame> class CircleWidget:public QFrame { Q_OBJECT public: CircleWidget(QWidget *parent); ~CircleWidget(); private: void paintEvent(QPaintEvent *event); }; #endif // CIRCLAWIDGET_H
circlewidget.cpp
# include"circlawidget.h" #include<QPainter> CircleWidget::CircleWidget(QWidget *parent):QFrame(parent) { } CircleWidget::~CircleWidget() { } void CircleWidget::paintEvent(QPaintEvent *event) { QPainter painter(this); painter.setBrush(QBrush(QColor(0x00,0xFF,0x00))); painter.drawEllipse(QPoint(100,100),100,100); }
main.cpp
#include "mainwindow.h" #include <QApplication> #include "circlawidget.h" int main(int argc, char *argv[]) { QApplication a(argc, argv); //MainWindow w; CircleWidget w(NULL); w.resize(400,300); w.show(); return a.exec(); }
显示效果:
这个过程演示了如何通过自定义类创建一个Widget窗口显示一个圆。
但是实际的过程是我们需要将新建的Wiget或Frame窗口作为一个子窗口在父窗口中调用,那应该如何实现?通过以下方法:
1.新建一个MainWidget的工程,按照上面的方法构建CircleWidget类,在ui界面工具栏选择Widget或Frame 放入ui界面。
2.右击widget控件,选择Promote to ...,出现如下界面
3.在promoted class name: 填入类名“CircleWidget”,点击add
4.在多选框打钩,点击Promote 按键。
通过以上步奏就完成了添加自定义控件到主界面中。这里不要忘了在main.cpp中修改显示主界面。
main.cpp
#include "mainwindow.h" #include <QApplication> #include "circlewidget.h" int main(int argc, char *argv[]) { QApplication a(argc, argv); MainWindow w; //CircleWidget w(NULL); // w.resize(400,300); w.show(); return a.exec(); }
完成后效果: