Basic
新建一个QT窗口项目,其文件结构如下图所示:
其中main.cpp
负责主程序的逻辑:
#include "widget.h"
#include <QApplication>
int main(int argc, char *argv[])
{
QApplication a(argc, argv); //app对象,有且仅有一个
Widget w;
w.show();
return a.exec(); // 阻塞
}
```c++
#include "widget.h"
#include <QPushButton>
Widget::Widget(QWidget *parent):QWidget(parent)
{
setWindowTitle("title");
setFixedSize(800,600);
QPushButton * btn2=new QPushButton("text",this);
QPushButton * btn1=new QPushButton;
btn1->setParent(this);
btn1->setText("close");
btn1->move(50,50); // 移动按键,窗口左上角为(0,0)
// connect(sender,signal,receiver,method)
connect(btn1,&QPushButton::clicked,this,&QWidget::close);
}
Widget::~Widget()
{
}
Signal and Slot
信号与槽函数是QT的核心,信号可以看做是事件,槽函数可以看做是对事件发生后的处理逻辑。
首先看下sender的代码及其信号,注意信号无返回值,也不需要实现的,只需要定义即可。
```c++
#ifndef SENDER_H
#define SENDER_H
#include <QObject>
class Sender : public QObject
{
Q_OBJECT
public:
explicit Sender(QObject *parent = nullptr);
signals:
void Signal(); // 信号无返回值,不需要实现
void Signal(const char* s); // 重载信号
public slots:
};
#endif // SENDER_H
接收方的槽函数用于处理信号发生时的逻辑,对于有参信号,槽函数必须与其保持一致。此处的槽函数逻辑就设为简单的打印。
```c++
#ifndef RECIVIER_H
#define RECIVIER_H
#include <QObject>
class Receiver : public QObject
{
Q_OBJECT
public:
explicit Receiver(QObject *parent = nullptr);
signals:
public slots:
void Slot(); // 槽函数无返回,需要处理逻辑
void Slot(const char* s); // 重载槽函数
};
#endif // RECIVIER_H
```c++
#include "receiver.h"
#include <QDebug>
Receiver::Receiver(QObject *parent) : QObject(parent)
{
}
/*无参槽函数*/
void Receiver::Slot()
{
qDebug("non-param signal!");
}
/*重载槽函数*/
void Receiver::Slot(const char* s)
{
qDebug("signal: %s",s);
}
最后是界面逻辑,主要分为两步:1. 连接信号与槽函数,两者可以是多对多的关系;2. 触发信号,有多种方式。
```c++
#include "widget.h"
#include <QPushButton>
Widget::Widget(QWidget *parent)
: QWidget(parent)
{
Sender * s=new Sender(this);
Receiver * r=new Receiver(this);
/*无参信号与无参槽函数*/
void(Sender::*sS)(void)=&Sender::Signal;
void(Receiver::*rS)(void)=&Receiver::Slot;
/*有参信号与有参槽函数*/
void(Sender::*sS_with_P)(const char *)=&Sender::Signal;
void(Receiver::*rS_with_P)(const char *)=&Receiver::Slot;
/*1. 连接信号与槽*/
connect(s,sS,r,rS);
connect(s,sS_with_P,r,rS_with_P);
/*2. 自触发信号*/
emit s->Signal();
emit s->Signal("hello");
/*2. 按键触发无参信号*/
QPushButton *btn=new QPushButton("trigger",this);
connect(btn,&QPushButton::clicked,s,sS);
/*2. 按键触发有参信号,使用匿名函数*/
connect(btn,&QPushButton::clicked,this,[=](){s->Signal("hello");});
}
Widget::~Widget()
{
}