当前位置: 首页 > news >正文

Qt窗口交互场景、子窗口数据获取

一、前言

在现代软件开发中,图形用户界面(GUI)的设计不仅仅关乎美观,更在于用户体验和功能的无缝衔接。Qt框架以其强大的跨平台能力和丰富的组件库,成为众多开发者构建GUI应用的首选工具。在Qt应用中,窗口之间的交互和数据传递是构建复杂用户流程的关键,尤其在需要从子窗口获取数据并在主窗口或另一个窗口中展示的情境下,这一过程变得尤为突出。

一个典型的场景:主窗口A作为应用的入口,引导用户进入子窗口B以输入特定信息。当用户完成输入并确认后,B窗口将关闭,同时确保A窗口能够捕获并处理这些数据。随后,A窗口将基于所获取的信息,弹出C窗口以直观展示结果,为用户提供即时反馈。这一流程不仅体现了Qt框架中窗口通信的灵活性,也展现了其在构建响应式、交互式应用方面的强大能力。

image-20240715154639962

二、实现代码

在Qt中,窗口间的通信和数据传递可以通过信号与槽机制实现。以下是一个使用Qt框架的C++代码示例,展示如何从一个数据输入窗口(B窗口)获取用户输入的信息,然后在主窗口(A窗口)中显示这些信息,并最终在另一个窗口(C窗口)中以表格的形式呈现出来。

首先,需要创建三个类:MainWindow(A窗口)、InputDialog(B窗口)和DisplayWindow(C窗口)。这里使用QDialog作为B和C窗口的基础,而A窗口则使用QWidget。将使用QTableWidget在C窗口中展示数据。

步骤1:创建MainWindow

MainWindow类包含了一个按钮,用于触发弹出InputDialog,以及一个槽函数用于接收数据并显示DisplayWindow

class MainWindow : public QWidget
{Q_OBJECTpublic:MainWindow(QWidget *parent = nullptr);~MainWindow();private slots:void showInputDialog();void handleDataFromInputDialog(const QMap<QString, QString> &data);private:QPushButton *m_button;
};

步骤2:实现MainWindow

MainWindow::MainWindow(QWidget *parent): QWidget(parent)
{m_button = new QPushButton("Open Input Dialog", this);connect(m_button, &QPushButton::clicked, this, &MainWindow::showInputDialog);QVBoxLayout *layout = new QVBoxLayout(this);layout->addWidget(m_button);
}MainWindow::~MainWindow()
{
}void MainWindow::showInputDialog()
{InputDialog *inputDialog = new InputDialog(this);connect(inputDialog, &InputDialog::dataReady, this, &MainWindow::handleDataFromInputDialog);inputDialog->exec();
}void MainWindow::handleDataFromInputDialog(const QMap<QString, QString> &data)
{DisplayWindow *displayWindow = new DisplayWindow(data, this);displayWindow->show();
}

步骤3:创建InputDialog

InputDialog类是一个简单的对话框,包含文本输入字段,用于收集用户数据。

class InputDialog : public QDialog
{Q_OBJECTpublic:InputDialog(QWidget *parent = nullptr);signals:void dataReady(QMap<QString, QString> data);private slots:void accept();private:QLineEdit *m_nameInput;QLineEdit *m_ageInput;
};

步骤4:实现InputDialog

InputDialog::InputDialog(QWidget *parent): QDialog(parent)
{m_nameInput = new QLineEdit(this);m_ageInput = new QLineEdit(this);QVBoxLayout *layout = new QVBoxLayout(this);layout->addWidget(new QLabel("Name:", this));layout->addWidget(m_nameInput);layout->addWidget(new QLabel("Age:", this));layout->addWidget(m_ageInput);QDialogButtonBox *buttonBox = new QDialogButtonBox(QDialogButtonBox::Ok | QDialogButtonBox::Cancel);layout->addWidget(buttonBox);connect(buttonBox, &QDialogButtonBox::accepted, this, &InputDialog::accept);connect(buttonBox, &QDialogButtonBox::rejected, this, &InputDialog::reject);
}void InputDialog::accept()
{QMap<QString, QString> data;data["Name"] = m_nameInput->text();data["Age"] = m_ageInput->text();emit dataReady(data);QDialog::accept();
}

步骤5:创建DisplayWindow

DisplayWindow类将接收数据并通过QTableWidget显示出来。

class DisplayWindow : public QDialog
{Q_OBJECTpublic:explicit DisplayWindow(const QMap<QString, QString> &data, QWidget *parent = nullptr);private:QTableWidget *m_tableWidget;
};

步骤6:实现DisplayWindow

DisplayWindow::DisplayWindow(const QMap<QString, QString> &data, QWidget *parent): QDialog(parent)
{m_tableWidget = new QTableWidget(this);m_tableWidget->setRowCount(data.size());m_tableWidget->setColumnCount(2);m_tableWidget->setHorizontalHeaderLabels(QStringList() << "Field" << "Value");int row = 0;for (auto it = data.begin(); it != data.end(); ++it) {QTableWidgetItem *keyItem = new QTableWidgetItem(it.key());QTableWidgetItem *valueItem = new QTableWidgetItem(it.value());m_tableWidget->setItem(row, 0, keyItem);m_tableWidget->setItem(row, 1, valueItem);++row;}QVBoxLayout *layout = new QVBoxLayout(this);layout->addWidget(m_tableWidget);
}

步骤7:在main.cpp中实例化MainWindow并启动应用

#include <QApplication>
#include "mainwindow.h"int main(int argc, char *argv[])
{QApplication app(argc, argv);MainWindow mainWindow;mainWindow.show();return app.exec();
}

以上代码示例展示了如何在Qt中使用信号与槽机制来实现在窗口间传递数据,以及如何使用QTableWidget来展示这些数据。

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • AcWing 723. PUM
  • 改善工作流
  • Spring Boot如何实现数据脱敏?
  • 在Spring Boot中使用MyBatis实现复杂查询和分页功能
  • Java基础之循环嵌套
  • K8S学习笔记(自用,不定期更新)
  • Docker-命令
  • Tomcat初篇
  • Java 网络编程练习
  • 新天龙八部3江山策仿官方+单机联网+GM工具
  • 【抓包】- Fiddler抓包教程,使用Fiddle抓取B站视频;ffmpeg的使用方法
  • Eureka入门指南:微服务注册与发现的基础概念
  • 软件开发感悟
  • go注册到eureka微服务
  • 构建AI知识库:4大优势+无限可能,共绘在线教育蓝图!
  • Android 架构优化~MVP 架构改造
  • C++11: atomic 头文件
  • canvas 五子棋游戏
  • LeetCode18.四数之和 JavaScript
  • scrapy学习之路4(itemloder的使用)
  • springMvc学习笔记(2)
  • SQLServer插入数据
  • underscore源码剖析之整体架构
  • Vim Clutch | 面向脚踏板编程……
  • 从@property说起(二)当我们写下@property (nonatomic, weak) id obj时,我们究竟写了什么...
  • 订阅Forge Viewer所有的事件
  • 使用 QuickBI 搭建酷炫可视化分析
  • 用Canvas画一棵二叉树
  • Java总结 - String - 这篇请使劲喷我
  • puppet连载22:define用法
  • 国内唯一,阿里云入选全球区块链云服务报告,领先AWS、Google ...
  • ​ 无限可能性的探索:Amazon Lightsail轻量应用服务器引领数字化时代创新发展
  • ​决定德拉瓦州地区版图的关键历史事件
  • ​马来语翻译中文去哪比较好?
  • ​批处理文件中的errorlevel用法
  • # Kafka_深入探秘者(2):kafka 生产者
  • ## 1.3.Git命令
  • #QT(智能家居界面-界面切换)
  • #大学#套接字
  • #图像处理
  • #我与Java虚拟机的故事#连载11: JVM学习之路
  • (4)STL算法之比较
  • (SpringBoot)第二章:Spring创建和使用
  • (二开)Flink 修改源码拓展 SQL 语法
  • (附源码)php投票系统 毕业设计 121500
  • (附源码)ssm基于web技术的医务志愿者管理系统 毕业设计 100910
  • (数据结构)顺序表的定义
  • (一)pytest自动化测试框架之生成测试报告(mac系统)
  • (转)3D模板阴影原理
  • (转)eclipse内存溢出设置 -Xms212m -Xmx804m -XX:PermSize=250M -XX:MaxPermSize=356m
  • .NET “底层”异步编程模式——异步编程模型(Asynchronous Programming Model,APM)...
  • .NET Remoting Basic(10)-创建不同宿主的客户端与服务器端
  • .net 后台导出excel ,word
  • .NET 漏洞分析 | 某ERP系统存在SQL注入
  • .NET 使用 ILMerge 合并多个程序集,避免引入额外的依赖