在很多软件中,都有这样一个设定:点击菜单栏中的某一个选项,软件将弹出一个新的窗体,用户在该窗体上进行简单的设置,于是主窗体会根据设定做出相应的改变。
这次我将来尝试一下,具体任务如下:
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!
相关推荐
Qt主窗口与子窗口之间相互传值,对新手有帮助。
QT两个窗口之间传值,打开一个子页面在子页面输入内容 再将内容传到父窗口
Qt中利用信号与槽将值从子窗口传输到父窗口的,主要在我的博客里叙述
Qt 子窗口父窗口切换,窗口间传值
python Qt5GUI界面主窗口和子窗口相互传值,保证能用。。。。。。。。。。。。。!
Qt主窗口与子窗口之间相互传值,对新手可能有些帮助吧!
Qt6:子窗口向父窗口传值
Qt6:子窗口向父窗口传值(多控件版)
子窗口通过信号槽给主窗口传值
解决初学者学习Qt窗体间传递数据的问题http://blog.csdn.net/shihoongbo/article/details/48681979
【QT】父组件与子组件的相互通信例子(用signal-slot实现) 目标: 新建一个QMainWindow窗口,在该窗口中添加一个打开按钮,一个spinBox,点击打开按钮后弹出一个对话框,对话框里面有一个slider。改变slider后...
看到学弟学习QT,用QT做了一个sqlite的学生管理和教师管理的程序。完整版的,分享给大家学习。我用的QT5.12.12.里面有QTabWidget,dialogwidget,QTableWidget。...窗口之间的通信emit,绑定信号和槽slot
(1)进度条等显示在主窗口状态栏的右端,代码如下: from PyQt5.QtWidgets import QMainWindow, QProgressBar, QApplication, QLabel import sys class SampleBar(QMainWindow): Main Application def __init__...