相关应用:
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);