在不少軟件中,都有這樣一個設定:點擊菜單欄中的某一個選項,軟件將彈出一個新的窗體,用戶在該窗體上進行簡單的設置,因而主窗體會根據設定作出相應的改變。函數
此次我未來嘗試一下,具體任務以下:佈局
QMainWindow的菜單欄中,點擊菜單選項,彈出一個QDialog對話框,可輸入文本,輸入文本完成以後,點擊對話框的肯定按鈕,輸入的文本將顯示到主界面QMainWindow上。ui
咱們一步一步來完成這個任務:this
1、主界面QMainWindow的設置
如上圖所示,本次實驗咱們主要用到其中的菜單欄和四個標籤中的一個標籤做爲顯示。 若點擊菜單欄中的「rotate」選項,會彈出子菜單「choose a angle」,點擊該子菜單將會彈出對話框。設計
關鍵代碼:blog
//菜單欄的設置繼承
QAction* rotate = new QAction("rotate a angel", this);
QMenu* menu2 = menuBar()->addMenu("rotate");
menu2->addAction(rotate);get
其他的佈局等知識點請詳見上篇博。it
2、子窗體QDialog的設置io
子窗體樣式以下:
設置方法以下:
在QMainWindow的基礎下 ,依葫蘆畫瓢建立一個.h頭文件和.cpp源文件,注意,名字應該相同爲好!以下圖舉例所示:
EditRotate.h
#include <QtWidgets/QDialog>
#include <QHBoxLayout>
#include <QTextEdit>
#include <QtWidgets/Qlabel>
#include <QtWidgets/qpushbutton.h>
class EditRotate : public QDialog
{
Q_OBJECT
public:
EditRotate(QWidget *parent = 0);
~EditRotate();
//定義控件
QLabel* label;
QTextEdit* edit;
QPushButton* btn;
signals:
void sendData(QString);
public slots:
void clickOk();
};
注意:這裏本來有跟Ui有關的私有成員,這裏我刪去了,這個東西是跟ui界面設計有關,也就是QT設計師設計有關,咱們這裏使用代碼就不用QT設計師了。
EditRotate.cpp
EditRotate::EditRotate(QWidget *parent)
: QDialog(parent)
{
this->setWindowModality(Qt::ApplicationModal);
//ui.setupUi(this);
this->setFixedSize(160, 50);
this->setWindowTitle("Rotate");
//初始化控件
label = new QLabel("Angel: ", this);
edit = new QTextEdit(this);
edit->resize(30, 10);
btn = new QPushButton("Ok", this);
//開始佈局
QHBoxLayout* hl = new QHBoxLayout(this);
hl->addWidget(label);
hl->addWidget(edit);
hl->addWidget(btn);
this->setLayout(hl);
//信號和槽函數鏈接
connect(btn, SIGNAL(clicked()), this, SLOT(clickOk()));
}
注:這裏繼承的是QDialog類。
3、主窗體和子窗體的信息傳遞(子->主)
這是本文講述的重點。具體實現方法見下:
1.在子窗口類聲明信號-----sendData(QString)
聲明槽函數----clickOK()
EditRotate.h
signals:
void sendData(QString); //只用聲明不用定義
public slots:
void clickOk();//須要定義,點擊按鈕的槽函數
2.定義clickOK槽函數---發射數據
EditRotate.cpp
void EditRotate::clickOk()
{
QString str = edit->toPlainText();
emit sendData(str);//使用emit關鍵詞,發射數據
}
3.主窗體類聲明槽函數
SimilarProject.h
public slots:
void clickRotateMenu();//點擊菜單,子窗體生成
void receiveData(QString data);//接受數據
4.主窗體槽函數定義
SimilarProject.cpp
void SimilarProject::clickRotateMenu()
{
//初始化窗體
e->show();
}
void SimilarProject::receiveData(QString data)
{
imgLab3->setText(data);
}
5.鏈接信號與槽
EditRotate.cpp
//子窗口按下信號和發射數據槽函數鏈接
connect(btn, SIGNAL(clicked()), this, SLOT(clickOk()));
SimilarProject.cpp
connect(rotate, SIGNAL(triggered()), this, SLOT(clickRotateMenu()));//菜單點擊,子窗體生成
connect(e,SIGNAL(sendData(QString)),this,SLOT(receiveData(QString)));//發射信號和接受槽函數鏈接
因而乎,子窗體設置,點擊,主窗體接收數據,顯示!
Done!