Daya Jin's Blog Python and Machine Leaning

QT Basic

2019-11-21

QT
 

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()
{
}

QWindow


Similar Posts

上一篇 Financial System

Content