.ui
QT界面设计项目中的.ui 文件可以直观感受到界面设计。
.h
Q_OBJECT 是Qt中定义的宏,只有直接或间接继承 QObject 类才可以使用,只有使用了该宏才具有信号槽机制。所创建类继承自 QMainWindow,而 QMainWindow 继承自 QWidget 即间接继承了 QObject,所有我们才能定义槽函数(Slot)。
.cpp
- 在这文件中我们实现绑定(connect)信号(Signal),实现一些菜单或者按钮的逻辑联动。
//connect函数使用: connect(const QtPrivate::FunctionPoint); //包含五个参数
- Qpinter类顾名思义用来绘制。一般使用步骤如下(只记录思路,没有涉及编译):
- 对于绘图事件,只需要在相应的位置进行重写即可。(如果不对paintEvent重写,其实现为空),不需要主动调用,Qt事件循环会自动处理绘图事件,并根据重写的内容做出响应。
//QWidget中的paintEvent事件处理器可以在子类中被重写来接收绘图事件 /*Widget子类.h */ // 在头文件中声明 void paintEvent(QPaintEvent *event); /*main.cpp*/ void main() { //1. 构造 } /*Widget子类.cpp*/ //在源文件中重写 void Widget::paintEvent(QPaintEvent *event) { // 实例化画家对象,this指定的是绘图设备 QPainter painter(this); }
update()会使窗口重绘图像,但是如果数据量太大,每次刷新的时候都重绘,就很浪费时间。
Q:如何不重绘,接着上回的内容继续绘画?
A:修改窗口属性。方法1:
Qt::WA_OpaquePaintEvent
Qt通常在调用paintEvent()之前擦除控件区域。如果设置了Qt::WA_OpaquePaintEvent属性,控件用不透明的颜色绘制其所有像素。
w.setAttribute(Qt::WA_OpaquePaintEvent); w.update(); w.repaint();
方法2
Qt::WA_NoSystemBackground
表明当前widget没有背景,即,当前widget接收到paint事件时背景不会自动重绘。Q: 分别窗口属性设置为以上两种,多次调用update() / repaint()通常只会导致一次paintEvent()调用,如果不重绘,多次调用update,是否需要考虑会漏掉某些绘画内容?
A: 分别窗口属性设置为以上两种,多次调用update() / repaint()测试,发现没有丢数据,但是绘制过程中修改窗口大小还是会丢掉之前内容,移动窗口不会丢失。绘制背景是黑色。Q: 画一个叠加的两色图像,为什么看起来没有居中?
A: 可能是pen.setWidth(int widthh) 设置线宽搞的鬼,一般先设置1,看看效果,如果线宽大于1,要注意drawPoint/ drawLine实际占的像素数量,做相应偏移。