1. 程式人生 > >QT兩個視窗間的相互切換

QT兩個視窗間的相互切換

  訊號(signals)與槽(slots)是QT重要機制,例子使用了C++11 lambda表示式進行了訊號與槽的連線。

實現兩個視窗通過點選按鈕完成互相切換,注意子視窗只能傳送訊號,不能處理,所有訊號應在主視窗定義相應處理槽函式處理。

主視窗:

mywidget.h

#ifndef MYWIDGET_H
#define MYWIDGET_H

#include <QWidget> #include <QPushButton> #include "win_1.h" class mywidget : public QWidget { Q_OBJECT public: mywidget(QWidget *parent = 0); ~mywidget();
void on_b1_clicked(); void on_b3_clicked(); void work_s1(); void work_s2(int,QString); private: QPushButton b1,*b2,b3; win_1 w; }; #endif // MYWIDGET_H

 

mywidget.cpp

#include "mywidget.h"

#include <QDebug>


mywidget::mywidget(QWidget *parent) : QWidget(parent) { b1.setParent(this); b1.setText("按鈕1"); b1.move(100,100); b2=new QPushButton(this); //b2->setParent(this); b2->setText("按鈕2");
connect(b2,&QPushButton::clicked,this,&mywidget::close); connect(&b1,&QPushButton::clicked,this,&mywidget::on_b1_clicked); connect(&b1,&QPushButton::clicked,b2,&mywidget::hide);

setWindowTitle("視窗1"); b3.setParent(this); b3.setText("轉到視窗2"); b3.move(200,200); connect(&b3,&QPushButton::clicked,this,&mywidget::on_b3_clicked); void (win_1::*signal_01)()=&win_1::signal_0; void(win_1::*signal_02)(int,QString)=&win_1::signal_0; connect(&w,signal_01,this,&mywidget::work_s1); connect(&w,signal_02,this,&mywidget::work_s2); //lambda表示式,只讀方式,注意在.pro檔案中配置C++11 // = 外部所有成員以值傳入 // this 類中所有成員以值傳遞 // & 外部所有引用傳入 QPushButton *b4=new QPushButton(this); b4->setText("LAMBDA表示式"); b4->move(400,400); int a=10; connect(b4,&QPushButton::clicked, [=](bool bb) mutable //若想修改值,需加mutable { b4->setText("lambda表示式"); a++; qDebug()<<"成功!!!"<<a<<bb; } );   //設定尺寸,避免切換時視窗大小改變 resize(600,480);
} void mywidget::on_b1_clicked(){ b1.setText("我是按鈕1"); } void mywidget::on_b3_clicked(){ this->hide(); w.show(); } void mywidget::work_s1(){ w.hide(); show(); } void mywidget::work_s2(int i,QString s){ qDebug()<<i<<s.toUtf8().data(); } mywidget::~mywidget() { }

子視窗:

win_1.h

#ifndef WIN_1_H
#define WIN_1_H

#include <QWidget>
#include <QPushButton>

class win_1 : public QWidget
{
    Q_OBJECT
public:
    explicit win_1(QWidget *parent = nullptr);
    void send_s1();

signals:
    void signal_0();  //不帶參訊號
    void signal_0(int,QString);  //帶參訊號

public slots:

private:
    QPushButton b1;

};

#endif // WIN_1_H

win_1.cpp

#include "win_1.h"

win_1::win_1(QWidget *parent) : QWidget(parent)
{
    setWindowTitle("視窗2");
    b1.setParent(this);
    b1.setText("轉到視窗1");

    connect(&b1,&QPushButton::clicked,this,&win_1::send_s1);

    resize(600,480);
}
void win_1::send_s1(){
    emit signal_0();
    emit signal_0(250,"轉到視窗1");
}