【问题标题】:QDialog not calling MainWindow functionQDialog没有调用MainWindow函数
【发布时间】:2012-03-06 13:21:14
【问题描述】:

以下代码应该调用 MainWindow 函数,但它没有调用它。我正在使用 QT IDE。

#include "itemdialog.h"
#include "ui_itemdialog.h"
#include "mainwindow.h"

ItemDialog::ItemDialog(QWidget *parent) :
    QDialog(parent),
    ui(new Ui::ItemDialog)
{
    ui->setupUi(this);
    setWindowTitle("Status Dialog");

}

ItemDialog::~ItemDialog()
{
    delete ui;
}

void ItemDialog::on_pushButton_clicked()
{
    MainWindow *obj=new MainWindow;
    obj->okbuttonclicked(ui->lineEdit->text());
}

okbuttonclicked() 函数是在 MainWindow 中实现的。这个对话框不应该打开一个新窗口。它的功能只是将用户输入的内容返回给 MainWindow 函数。

这段代码有什么问题。请帮忙!

【问题讨论】:

  • 你试过火吗:obj->show() after obj->okbuttonclicked[...]?
  • 我为什么要调用obj->show(),窗口已经打开了。这个对话框只是为了从用户那里获取输入,然后将它传递给 MainWindow 函数以便采取进一步的行动..
  • 您的代码是否应该在按下对话框按钮时创建一个新的主窗口...?
  • 没有。窗口已经打开了。此对话框是 MainWindow 的子窗口
  • 您是从对话框中调用主窗口的函数吗?为什么?即使你做对了,这仍然是一个不好的做法。

标签: c++ qt qdialog


【解决方案1】:

这看起来像是实现输入对话框的可怕尝试。您应该发出一个信号,确认用户已经进行了输入,并将该信号连接到 MainWindow 中的适当插槽,并在 MainWindow 的构造函数中连接该信号和插槽。此外,如果您只是在模态对话框中获得单个字符串,则不应重新发明轮子,而应改用QInputDialog。

【讨论】:

    【解决方案2】:

    您正在创建一个新的(不可见的)主窗口,并在其上调用okbuttonclicked(),而不是已经打开的那个。您需要将现有的QMainWindow 传递到对话框中,如果它是模态的,则应将其用作对话框的父级来完成。否则创建一个新的构造函数 arg 来携带它。

    【讨论】:

    • 我已经通过 Qmainwindow 作为 Qdialog 的父级。现在我如何使用 parent(Qmainwindow) 来调用它的函数。你能告诉我编码吗
    • Koying 在他的回答中向您展示了。但 teukkam 的回答是更合适的解决方法。
    【解决方案3】:

    很脏,但是如果您的 QMainWindow 是您的 QDialog 的父级,您可以这样做:

    void ItemDialog::on_pushButton_clicked()
    {
        MainWindow *obj=qobject_cast<QMainWindow*>(parent());
        if (obj)
            obj->okbuttonclicked(ui->lineEdit->text());
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-05-20
      • 2016-11-21
      • 1970-01-01
      相关资源
      最近更新 更多