????? 在很多软件中,都有这样一个设定:点击菜单栏中的某一个选项,软件将弹出一个新的窗体,用户在该窗体上进行简单的设置,于是主窗体会根据设定做出相应的改变。
????? 这次我将来尝试一下,具体任务如下:
??????QMainWindow的菜单栏中,点击菜单选项,弹出一个QDialog对话框,可输入文本,输入文本完成之后,点击对话框的确定按钮,输入的文本将显示到主界面QMainWindow上。
????? 我们一步一步来完成这个任务:
?
一、主界面QMainWindow的设置
?????????????????????
如上图所示,本次实验我们主要用到其中的菜单栏和四个标签中的一个标签作为显示。?若点击菜单栏中的“rotate”选项,会弹出子菜单“choose a angle”,点击该子菜单将会弹出对话框。
关键代码:
//菜单栏的设置
?QAction* rotate = new QAction("rotate a angel", this);
?QMenu* menu2 = menuBar()->addMenu("rotate");
?menu2->addAction(rotate);
?
其余的布局等知识点请详见上篇博。
?
?
?
二、子窗体QDialog的设置
子窗体样式如下:
???????????????????????????????????????????????????????
设置方法如下:
????? 在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类。
?
三、主窗体和子窗体的信息传递(子->主)
这是本文讲述的重点。具体实现方法见下:
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!
原文:http://lps-683.iteye.com/blog/2260672