在很多软件中,都有这样一个设定:点击菜单栏中的某一个选项,软件将弹出一个新的窗体,用户在该窗体上进行简单的设置,于是主窗体会根据设定做出相应的改变。
这次我将来尝试一下,具体任务如下:
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中实现从子窗口(子对话框)向父窗口传递数据,具体涉及的主要文件包括`mainwindow.cpp`、`main.cpp`、...
本篇文章将详细探讨Qt窗口之间传递数据的方法和技巧,对初学者来说尤其具有指导意义。 首先,让我们理解Qt中的窗口对象关系。在Qt中,主窗口通常是应用的主要界面,而子窗口通常用于展示更详细的信息或者执行特定...
在QT编程中,窗口间的通信是常见的需求,特别是在开发多窗口应用时,如主界面与设置界面、对话框之间的交互。本主题将深入探讨如何在QT的两个窗口间传递值,以便在一个窗口(通常称为子窗口)中输入数据后,能够将...
总结,Qt6中子窗口向父窗口传值有多种策略,信号与槽是最推荐的方式,因为它简洁、直观且易于维护。根据项目的需求和复杂度,可以选择合适的方法进行窗口间的数据交换。在实际应用中,应考虑到代码的可读性、可维护...
首先,让我们了解Qt窗口系统的基础。在Qt中,QMainWindow通常作为主窗口,可以包含多个子窗口或对话框,如QDialog、QWidget或QStackedWidget等。这些子窗口可以通过继承自QWidget的类来创建,并通过调用show()方法...
本文将深入探讨如何在Qt5 GUI中实现主窗口(Parent Window)与子窗口(Child Window)之间的数据传递,确保程序的正常运行。 首先,我们需要了解Qt5中的窗口类。`QMainWindow`是Qt5中的主要窗口类,通常用于创建...
在Qt6框架中,开发GUI应用程序时,我们经常会遇到子窗口与父窗口之间通信的需求,尤其是在涉及多个控件交互的场景。子窗口向父窗口传递数据是常见的操作,例如用户在子窗口中填写表单后,点击确认按钮,将表单数据...
总结,Qt窗口间传值主要依赖于信号和槽机制,结合QVariant、QObject的属性系统以及其他辅助工具,可以实现灵活且高效的数据交换。理解并熟练掌握这些技巧,将极大地提升Qt应用的开发效率和质量。在实践中,应根据...
"pyqt父子窗口相互传值"这个主题就是关于如何在不同的QMainWindow或QWidget实例之间传递数据。下面将详细讲解这个过程,并提供一个可能的实现方式。 首先,我们需要理解PyQt中的窗口层次结构。在PyQt5中,窗口通常...
本源程序实例主要涉及如何在PyQt5中使用多窗体(多个窗口)并实现它们之间的值传递,这对于理解和构建复杂应用至关重要。 首先,我们来看"pyqt5+qt 多窗体互相传值源程序"这个标题。这表明这个项目将展示如何在两个...
在子窗口给主窗口传值的场景中,子窗口通常是弹出窗口或对话框,它需要在用户操作后(如点击按钮)将某些信息(如用户输入的数据)传递回主窗口,以便主窗口进行后续处理。 以下是一个简单的步骤概述: 1. **创建...
Qt的属性系统允许对象的属性之间进行绑定,这在窗口间数据传递中也非常有用。例如,你可以将一个窗体的属性(如文本框的文本)绑定到另一个窗体的属性,实现数据的实时同步。 ```cpp // 窗体A的属性 QObject::...
本篇将深入探讨如何在Qt中实现页面(窗口或视图)的切换以及在页面间传递值。 首先,我们来了解Qt中的页面切换。在Qt中,可以使用不同的类来表示“页面”,如`QWidget`、`QDialog`、`QStackedWidget`、`QMainWindow...
【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__...
这涉及到线程间通信(Thread Communication)的概念,它确保了不同线程之间的协作和数据同步。在Windows环境中,我们可以利用各种API函数来实现这一目标。 主线程通常负责用户界面(UI)的更新,而子线程则处理计算...
在Python的GUI库图形界面开发中,PyQt5是一个常用的选择,它提供了丰富的功能,包括...在实际开发中,务必注意文件路径的正确配置,以及在Python和JavaScript两端正确设置信号和槽,以确保数据能顺畅地在两者之间流动。