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("這裡是發送的資訊"));
}