天天看點

Qt學習筆記(二)Widget、PushButton控件,信号與槽,自定義槽函數,自定義信号

1. Widget控件相關

 自定義視窗類名為“MainWidget”,視窗名為“w”,按鈕名為“bn”

MainWidget w;//建立對象

w.resize(500,500);//調整視窗大小

w.setWindowTitle("...");//設定視窗名

w.show();//顯示控件(控件預設隐藏)

w.hide();控件隐藏

w.close();控件關閉

2. PushButton控件相關

#include<QPushButton>

QPushButton b1;

QPushButton *b2,*b4;

b2=new QPushButton;//建立按鈕對象

b1.setParent(*w);

QPushButton b3(*w);

b4=new QPushButton(*w);//指定父對象,否則是獨立控件

b1.setText("...");//設定按鈕内容

b1.move(100,100);//設定按鈕位置

3. 信号與槽的連接配接

connect(&b1,$QPushButton::pressed,$w,$MainWidget::close);

        信号類型有:按下pressed,點選clicked,彈起released

4. 自定義槽函數

在需要的位置編寫自定義函數作為信号的“回應”,修改connect函數的後兩個參數即可

5. 自定義信号

在需要發出信号的控件.h的signals聲明中添加信号 void MySignal();

在需要信号發出的位置自定義函數用于發出信号,函數體中調用MySignal();(信号也是函數)

觸發信号與發出信号的函數進行connect

在接受信号的位置将接收信号與槽函數進行connect

帶參數的信号見程式

6. Lambda表達式

見程式subwidget.cpp

7. 執行個體程式

main.cpp:

#include "mainwidget.h"
#include "subwidget.h"
#include <QApplication>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    MainWidget w;
    w.show();

    return a.exec();
}
           

mainwidget.h:

#include <QPushButton>

#include "subwidget.h"

class MainWidget : public QWidget
{
    Q_OBJECT

public:
    MainWidget(QWidget *parent = 0);
    ~MainWidget();
    //切換到子視窗
    void open_sub();
    //用子視窗含參信号傳回的資料做輸出
    void print_info(int,QString);

private:
    QPushButton b1;
    QPushButton b2;//兩個按鈕
    SubWidget w;   //子視窗
};

#endif // MAINWIDGET_H
           

subwidget.h:

#ifndef SUBWIDGET_H
#define SUBWIDGET_H

#include <QWidget>
#include <QPushButton>

class SubWidget : public QWidget
{
    Q_OBJECT
public:
    explicit SubWidget(QWidget *parent = nullptr);

    void open_main();//切換到主視窗

signals:
    void MySignal();
    void MySignal(int,QString);//重載信号

public slots:

private:
    QPushButton b1;
    QPushButton *b5;//兩個按鈕
};

#endif // SUBWIDGET_H
           

mainwidget.cpp:

#include "mainwidget.h"
#include <QDebug>       //實作c++中的cout功能,用法為qDebug()<<...

MainWidget::MainWidget(QWidget *parent)
    : QWidget(parent)
{
    setWindowTitle("MAIN");//視窗标題

    b1.setParent(this);
    b1.setText("SUB");
    b2.setParent(this);
    b2.setText("CLOSE");
    b2.move(500,500);//兩個按鈕的父對象、内容、位置

    //b1按下,調用自定義槽函數open_sub
    connect(&b1,&QPushButton::clicked,this,&MainWidget::open_sub);
    //b2按下,調用自帶槽函數關閉視窗
    connect(&b2,&QPushButton::clicked,this,&MainWidget::close);

    //重載的兩個信号建立各自的函數指針,信号也是函數
    void (SubWidget::*open_main)()=&SubWidget::MySignal;
    connect(&w,open_main,this,&MainWidget::show);
    void (SubWidget::*send_info)(int,QString)=&SubWidget::MySignal;
    connect(&w,send_info,this,&MainWidget::print_info);

    //自定義視窗大小,防止再次顯示視窗時自動改變大小
    resize(600,530);
}

MainWidget::~MainWidget()
{

}

void MainWidget::open_sub()
{
    w.show();
    this->hide();
}
void MainWidget::print_info(int n,QString str)
{
    qDebug()<<n<<str<<endl;
}
           

subwidget.cpp:

#include "subwidget.h"

#include <QDebug>

SubWidget::SubWidget(QWidget *parent) : QWidget(parent)
{
    setWindowTitle("SUB");
    b1.setParent(this);
    b1.setText("MAIN");

    b5=new QPushButton(this);
    b5->setText("lambda");
    b5->move(100,100);

    connect(&b1,&QPushButton::clicked,this,&SubWidget::open_main);
    connect(b5,&QPushButton::clicked,           //lambda表達式代替後兩個參數
            [&]()                               //格式為[捕獲變量](參數){函數體}
            {                                   //一定記得在項目檔案中加 CONFIG += C++11
                qDebug()<<"使用了lambda表達式";   //[=]:外部所有局部變量值傳遞捕獲
                b5->setText("ok");              //[&]:父對象成員值傳遞捕獲
            }                                   //[value]:變量value值傳遞捕獲
            );

    resize(300,300);
}

void SubWidget::open_main()
{
    this->hide();
    MySignal();
    MySignal(666,QString("這裡是發送的資訊"));
}
           

繼續閱讀