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

举报
DS小龙哥 发表于 2024/08/12 10:03:18 2024/08/12
【摘要】 Qt框架以其强大的跨平台能力和丰富的组件库,成为众多开发者构建GUI应用的首选工具。在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


cpp
class MainWindow : public QWidget
{
    Q_OBJECT

public:
    MainWindow(QWidget *parent = nullptr);
    ~MainWindow();

private slots:
    void showInputDialog();
    void handleDataFromInputDialog(const QMap<QString, QString> &data);

private:
    QPushButton *m_button;
};

步骤2:实现MainWindow


cpp
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类是一个简单的对话框,包含文本输入字段,用于收集用户数据。


cpp
class InputDialog : public QDialog
{
    Q_OBJECT

public:
    InputDialog(QWidget *parent = nullptr);

signals:
    void dataReady(QMap<QString, QString> data);

private slots:
    void accept();

private:
    QLineEdit *m_nameInput;
    QLineEdit *m_ageInput;
};

步骤4:实现InputDialog


cpp
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显示出来。


cpp
class DisplayWindow : public QDialog
{
    Q_OBJECT

public:
    explicit DisplayWindow(const QMap<QString, QString> &data, QWidget *parent = nullptr);

private:
    QTableWidget *m_tableWidget;
};

步骤6:实现DisplayWindow


cpp
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并启动应用


cpp
#include <QApplication>
#include "mainwindow.h"

int main(int argc, char *argv[])
{
    QApplication app(argc, argv);
    MainWindow mainWindow;
    mainWindow.show();
    return app.exec();
}

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

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。