一、关于Qt
我们都知道Qt是一个用于做gui界面开发的框架,Qt拥有强大的组件开发机制,Qt同时也是一个跨平台的C++界面开发框架,他和MFC不太一样,MFC主要是专注于windows上的界面开发。Qt中比较有特点的东西也就是信号槽机制,在讲信号槽机制之前,我们将说一下Qt中一些比较基础的东西。
1、Qt中常用的快捷键
1)、帮助文档的转换,F1可以查看帮助文档,两次F1可以将文档全凭显示。
2)、.h和.cpp文件的转换,快捷键为F4
3)、编译并且运行:Ctrl + R
4)、函数的声明和定义之间的转换:F2
5)、代码的注释与取消:Ctrl + /
6)、字体的大小写变换:Ctrl + 鼠标滚轮向上向下
7)、移动代码:选中所要移动的代码 -> 按住 ctrl + shift -> 键盘方向键
8)、查找替换关键字:ctrl + f
9)、快速打开代码所在目录:编辑模式下 -> 选中项目文件 -> 右击 -> 选择“显示包含的目录”,即可显示项目所在目录(此方法同样可以打开代码文件所在目录)
2、如何查看Qt的帮助文档
1)、类使用的相关介绍
2)、查看所有部件类的相应的成员函数(功能、参数、返回值)
3)、查看部件的信号
4)、查看部件的部件(所对应的虚函数如何编写)
公有成员函数:操作部件属性的相关函数。
公有槽函数:Qt类中已经定义好的槽函数,直接可与信号相连接。
信号:软中断,如按下按钮触发 pressed() 信号等。
保护成员函数:通常事件所对应的虚函数放在此处。
事件:常用事件,如操作鼠标触发的鼠标事件。
文档使用简单介绍到这来,它里面没有什么有难度的东西。
3、Qt中的基本模块
1)、Qt widgets
2)、Qt WebKit
3)、Qt Test
4)、Qt Sql
5)、Qt quick
6)、Qt Qml
7)、Qt Multimedia Widgets
8)、Qt Core
9)、Qt gui
10)、Qt network
11)、Qt Multimedia
12)、Qt quick Control
13)、Qt quick dialog
4、Qt中的窗口继承关系
5、Qt中的内存回收机制
1)、 类直接或间接从QObject类派生
2)、给这个类指定父类
二、Qt中的信号槽机制
Qt中的信号槽由信号和槽函数构成,所以接下来我们先聊聊信号和槽函数
1、信号
1)、是一个函数
a. 这个函数不需要实现, 只声明就可以
b. 使用关键字 signals 限定
2)、 信号函数返回值: void
3)、 可以重载
4)、信号可以连接信号
5)、信号可以连接多个槽函数
connect(sender, sig, recv, slot1);
connect(sender, sig, recv, slot2);
connect(sender, sig, recv, slot3);
connect(sender, sig, recv, slot4);
6)、 多个信号可以链接同一个槽函数
2、槽函数
* 槽函数
1)、qt5中的槽函数, 类的成员函数, 全局函数, 静态函数, lambda表达式(C++11的新特性, 匿名函数)
2)、 返回值void
3)、可以重载
4)、参数需要跟信号的参数一一对应
void sig(int, double, QStirng)
void slot(int, double, QStirng)
5)、 槽函数的参数个数 小于 信号的参数个数 — 可以
6)、槽函数的参数个数 大于 信号的参数个数 — 不可以
7)、 自定义槽函数 – 一般的时候添加一个类的成员函数(C++)
3、Qt4的信号槽
connect(sender, SINGAL(sig(int, QString), receiver, SLOT(slot(int, QString));
两个宏 SINGAL, SLOT 将函数名转换为字符串
qt4缺陷:
不安全, 宏替换的时候不会做错误判断
案例代码:
pro文件中的代码
QT += core gui
greaterThan(QT_MAJOR_VERSION, 4): QT += widgets
TARGET = HelloQt
TEMPLATE = app
SOURCES += main.cpp\
mywidget.cpp \
mybutton.cpp \
subwidget.cpp
HEADERS += mywidget.h \
mybutton.h \
subwidget.h
CONFIG += c++11
main文件中的代码:
#include "mywidget.h"
#include <QApplication>
int main(int argc, char *argv[])
{
QApplication a(argc, argv)
MyWidget w;
w.show();
return a.exec();
}
头文件mywidget.h中的代码
#ifndef MYWIDGET_H
#define MYWIDGET_H
#include <QWidget>
#include <QPushButton>
#include "mybutton.h"
#include "subwidget.h"
class MyWidget : public QWidget
{
Q_OBJECT
public:
MyWidget(QWidget *parent = 0);
~MyWidget();
public slots:
void mySlot();
void showMainWindow(QString str);
signals:
void aaa();
private:
QPushButton* m_btn1;
MyButton *m_btn2;
SubWidget m_sub;
};
#endif
头文件subwidget.h中的代码:
#ifndef SUBWIDGET_H
#define SUBWIDGET_H
#include <QWidget>
#include <QPushButton>
class SubWidget : public QWidget
{
Q_OBJECT
public:
explicit SubWidget(QWidget *parent = 0);
signals:
void mainShow();
void mainShow(QString);
public slots:
void subSlot();
private:
QPushButton* btn;
};
#endif
源文件mywidget.cpp中的代码
#include "mywidget.h"
#include <QDebug>
MyWidget::MyWidget(QWidget *parent)
: QWidget(parent)
{
this->setWindowTitle("0105");
this->setWindowIcon(QIcon("D:\\face.png"));
m_btn1 = new QPushButton(this);
m_btn1->setText("hello, Qt");
m_btn1->move(100, 100);
m_btn2 = new MyButton(this);
m_btn2->move(200, 200);
m_btn2->show();
void (SubWidget::*func1)() = &SubWidget::mainShow;
connect(&m_sub, func1, this, &MyWidget::show);
connect(m_btn2, &MyButton::clicked, this, [=]()
{
m_btn1->setText("aaaa");
});
}
MyWidget::~MyWidget()
{
}
void MyWidget::mySlot()
{
m_btn2->setText("aaa");
m_sub.show();
this->hide();
}
void MyWidget::showMainWindow(QString str)
{
qDebug() << str.toUtf8().data();
}
源文件subwidget.cpp中的代码:
#include "subwidget.h"
SubWidget::SubWidget(QWidget *parent) : QWidget(parent)
{
btn = new QPushButton(this);
btn->move(200, 200);
void (SubWidget::*func1)() = &SubWidget::mainShow;
connect(btn, &QPushButton::clicked, this, &SubWidget::subSlot);
connect(btn, &QPushButton::clicked, this, func1);
}
void SubWidget::subSlot()
{
emit mainShow("aaa!!!");
this->hide();
}