在 QT 中的两个 QWidget 表单之间传递参数

Posted

技术标签:

【中文标题】在 QT 中的两个 QWidget 表单之间传递参数【英文标题】:passing a parameter between two QWidget forms in QT 【发布时间】:2013-05-31 09:37:40 【问题描述】:

我是 QT 的新手,我正在尝试在两种形式之间传递一个参数,但我无法做到这一点..谁能帮助我,请给我一个传递字符串常量“参数”的简单示例" 从主窗口到另一个名为 results 的 QWidget 0 窗口

【问题讨论】:

【参考方案1】:

我不太确定你在这里问什么,因为我认为这很简单,但这里是头文件的完整代码:

#ifndef CMAINWINDOW_H
#define CMAINWINDOW_H

#include <QDialog>
#include <QLabel>
#include <QPushButton>

/* this is your dialog with results.
   It contains one label to show the value of parameter passed in. */
class CResults : public QDialog

    Q_OBJECT

  public:
    CResults(const QString & text = QString(), QWidget *parent = 0);

    void setText(const QString & text);

  private:
    QLabel *m_lbl;
;

/* This is your main top-level window which contains two push buttons.
   Each of them triggers one dialog and passes a different parameter to it. */
class CMainWindow : public QWidget

    Q_OBJECT

  public:
    CMainWindow(void);


  private slots:
    void onDialog1BtnClick(void);
    void onDialog2BtnClick(void);

  private:
    QPushButton *m_pb_dlg1;
    QPushButton *m_pb_dlg2;
    CResults *m_dlg1;
    CResults *m_dlg2;
;

#endif // CMAINWINDOW_H

这是实现:

#include "CMainWindow.h"

#include <QVBoxLayout>

CResults::CResults(const QString & text, QWidget *parent)
  : QDialog(parent)

  m_lbl = new QLabel(text, this);


void CResults::setText(const QString & text)

  m_lbl->setText(text);



CMainWindow::CMainWindow(void)
 : QWidget(0)

  /* The following line shows one way of passing parameters to widgets and
     that is via constructor during instantiation */
  m_dlg1 = new CResults("parameter", this);
  m_dlg2 = new CResults(QString(), this);
  m_pb_dlg1 = new QPushButton("Dialog1", this);
  connect(m_pb_dlg1, SIGNAL(clicked()), SLOT(onDialog1BtnClick()));
  m_pb_dlg2 = new QPushButton("Dialog2", this);
  connect(m_pb_dlg2, SIGNAL(clicked()), SLOT(onDialog2BtnClick()));

  QVBoxLayout *l = new QVBoxLayout(this);
  l->addWidget(m_pb_dlg1);
  l->addWidget(m_pb_dlg2);

  setLayout(l);


void CMainWindow::onDialog1BtnClick(void)

  m_dlg1->exec();


void CMainWindow::onDialog2BtnClick(void)

  /* In this case you want to override the default value passed to constructor,
     so you will use the setter function */
  m_dlg2->setText("Something random");
  m_dlg2->exec();

如果你的意思是别的,请更具体,以便我可以调整我的答案。

【讨论】:

感谢您的回答,正如我所说,我对 qt 很陌生,我希望您可以评论上面的代码,以便我知道每个添加的代码是什么(您添加了它) 方法。我会非常感谢你的帮助,因为我很痛苦,我没有时间。我的问题的意思是有一个在主窗口中传递字符串参数的简单示例,假设它来自文本编辑,我希望它显示在第二个表单标签中..你能帮我吗? @NermeenoAlami 对 cme​​ts 感到抱歉,基本上我所做的是为结果对话框创建了一个 setter 函数,并在显示之前调用此函数来设置对话框的参数。我承认对于这样一个简单的问题,答案非常复杂,但我希望代码能够开箱即用,以便您可以试验它(您只需在 main() 的某处实例化 CMainWindow 类,仅此而已)。不过,Shf 的回应可能更容易理解。【参考方案2】:

您需要创建一个新类,比如MyWidget,派生自 QWidget 或 QDialog,您可以根据需要创建一个插槽 - setText(QString txt) 或您喜欢的任何方式。然后在您的 MainWindow 类中,创建 MyWidget 的实例 -

... code that leads to moment, where you want to create another widget
MyWidget* wg=new MyWidget();
wg->setText("And that's all the magic"); // you pass text to that widget's slot setText(), where you use it however you like

编辑

要在标签中显示文本,MyWidget 类中的插槽 setText(QString txt) 应该是这样的:

MyWidget::setText(QString txt)
    myLabel->setText(txt); // myLabel is Qlabel, that you created in MyWidget class    

【讨论】:

那我如何在标签中显示呢? 我试过你所说的,但我仍然有这个错误:(怎么了?'class MyWidget'没有名为'setText'的成员 好吧,你需要在你的项目中添加新类(项目 -> 添加新的 -> c++ 类 -> 选择 QWidget 作为父级)并在类声明中的头文件 (MyWidget.h) 中添加行public slots:void setText(Qstring txt) 紧随其后 Qt 强制开发人员正确编码 - 类由源文件 (.cpp) 和头文件 (*.h) 组成

以上是关于在 QT 中的两个 QWidget 表单之间传递参数的主要内容,如果未能解决你的问题,请参考以下文章

使用 Qt Designer 表单和 PyQt5 在 QWidget 中绘制 matplotlib 图形

QT中如何实现界面之间传递数据??

accept()函数用来告诉Qt,事件处理函数“接收”了这个事件,不要再传递;ignore()函数则告诉Qt,事件处理函数“忽略”了这个事件,需要继续传递(看一下QWidget::mousePress

qt工程中两个.cpp文件之间怎么动态的传递字符串

C语言 两个[不定参函数]之间如何进行 [参数传递]

必须在传递给 C 运行时函数的 QWidget 和无效参数之前构造一个 QApplication