相关应用:
Qt实现抽奖(滚动数)小程序:码云:传送门,GitHub:传送门 Qt实现签到小程序:码云:传送门,GitHub:传送门 Qt简单版贪吃蛇:码云:码云,GitHub:GitHub
一、 自定义信号和槽
1、信号和槽必须定义在类中
2、自定义信号和槽类必须继承QObject
3、在类的开头写上Q_OBJECT 没有分号,此标识符必须写在项目构建之前,如果是后加上的,必须重新构建项目。
4、信号定义在 signals:关键字下面。
5、通过emit发送信号
6、一个信号可以连接多个槽,当该信号发射会触发多个槽函数。
7、多个信号可同时连接一个槽,只要有一个信号发射就会触发槽函数。
二、界面布局
1、在设计界面时,一般不建议直接设计窗口或控件的大小(像素点数),除非容器固定大小,否则界面改变大小时布局会乱(丑)。
2、如果不固定窗口的大小一般使用自动布局,前提是在窗口添加一个布局器,然后设置窗口为自动布局(在窗口的空白位置右击 -> 布局
-> 水平、垂直、栅格)。
3、在窗口内部想让某些控件自动排列及设置大小,可以选择使用布局器:
水平布局:QHBoxLayout
垂直布局:QVBOXLayout
栅格布局:QGridLayout
布局器中的控件会根据布局器的大小自动排列控件,自动设置控件的大小。
4、设置窗口自动布局,控件会随窗口的大小而变化,可以使用“弹簧”来约束控件的位置。
三、项目资源
1、项目的资源一般是指项目中使用到的图片、音频、视频等。
2、使用图片文件有两种方式:
1.使用QPainter和QImage类读取资源文件,然后绘制在窗口或控件上。
2.创建Qt资源文件,统一管理图片等资源文件。
3、在窗口或控件上绘制图片
1.由于QPainter只能工作在paintEvent函数中,因此必须覆盖此函数。
2.QImage控制图片文件的路径即可,创建QImage对象。
3.QPainter创建时需要提供在窗口的地址。
4.QPainter对象调用drawImage成员函数绘制图片。
5.paintEvent会被update自动调用。
注意:不建议使用此方法显示图片,更多的是进行绘制图形。
4、Qt资源文件
1.选中项目右击 -> 添加新文件 -> Qt -> Qt资源文件 -> 填写资源文件名
2.双击打开创建好的资源文件 -> 添加 -> 添加前缀 -> 添加文件 -> 选择要添加的文件
3.可以在设计师中使用资源文件,选择控件右击 -> 改变样式表 -> 添加资源 -> image等。
4.也可以在代码中调用setStyleSheet函数,为控件设置样式。
5、设置控件样式表的技巧
1.在为窗口设置样式表后,窗口中的控件也会继承这个样式,我的解决方法是为控件也设置样式表,覆盖窗口的样式表。
QWidget
{
background-color: rgb(255, 255, 255);
}
QPushButton
{
background-color: rgb(255, 245, 66);
// 设置按钮的边框
border: 1px solid rgb(124, 124, 124);
// 设置按钮的圆角弧度
border-radius: 5px; // 设置按钮的圆角
}
2、设置控件的悬停样式
QPushButton:hover
{
}
3、设置按钮按下时的效果
QPushButton:pressed
{
}
四、定时器
Qt中的QTimer有两种使用方式:
信号:
start成员函数,开启定时器并设置定时器的时间间隔。
事件到后会发出timeout信号,连接槽函数即可。
事件:
继承QTimer 类,对该类进行扩展,并覆盖 void timerEvent(QTimerEvent *e) 事件。
void start(int msec)成员函数,开启定时器并设置定时器的时间间隔。
时间到后会自动执行timerEvent函数。
注意:时间函数被执行就会再产生timeout信号。
五、线程
Qt中的线程类不能直接使用,必须继承QThread并实现run函数。
新的线程类对象调用start成员函数时会自动执行run函数。
1、线程的终止
线程对象调用 void terminate() 成员函数会终止线程,但并不会立即终止,这取决于线程的调度策略。
terminate类似于线程的取消操作,而线程也可以回收
线程真正终止时会发射 void terminated() 信号。
也可以使用wait函数等待线程的终止,还可以回收线程的资源。
类似POSIX线程里的pthread_join函数。
2、线程ID
static Qt::HANDLE currentThreadId()
获取当前线程的id
static QThread* currentThread()
获取当前线程的句柄
六、鼠标与键盘事件
空间其实一直都在监控鼠标与键盘,当鼠标与键盘发生操作时会调用控件中的事件函数,事件函数默认什么都不做,如果想让事件函数做一些
操作,需要继承控件并覆盖事件函数。
// 鼠标按下
void mousePressEvent(QMouseEvent *);
// 鼠标弹起
void mouseReleaseEvent(QMouseEvent *);
// 鼠标双击
void mouseDoubleClickEvent(QMouseEvent *);
// 鼠标按下并移动
void mouseMoveEvent(QMouseEvent *);
// 键盘按下事件
void keyPressEvent(QKeyEvent* e);
成员函数 text 可以获取到按键的字符
成员函数 key 可以获取到键值 与 Qt::Keyx 进行比较
// 键盘弹起事件
void keyReleaseEvent(QKeyEvent* e);