在不少软件中,都有这样一个设定:点击菜单栏中的某一个选项,软件将弹出一个新的窗体,用户在该窗体上进行简单的设置,因而主窗体会根据设定作出相应的改变。函数
此次我未来尝试一下,具体任务以下:布局
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!