QMainWindow类和QDialogue类之间的交互

时间:2018-01-07 10:32:24

标签: c++ qt

我正在开发一个GUI应用程序。我有一个主窗口( QMainWindow ),当应用程序执行时会弹出。

{
    QApplication a(argc, argv);
    MainWindow w;
    w.show();

    return a.exec();
}

此窗口有一些按钮。当我点击此处的按钮时,会弹出另一个 QDialog 的窗口。按钮的逻辑是

void MainWindow::on_InsertButton_pressed()
{
    libinsert lib ;
    lib.setModal(false);
    lib.exec();
}

问题 :我在 QMainWindow 类中有一个套接字,每当我收到消息时,我都需要将其发送到 QDialogue 窗口并将其显示在 QLineEdit 中。使用上述逻辑,即使我将 QDialogue 设置为 nonmodal ,当 QDialogue <时,我也无法与 QMainWindow 进行交互/ em>窗口已打开。我尝试了 lib.show()而不是 lib.exec(),但是当我点击按钮时, QMainWindow 类< em> QDialogue 窗口不会弹出。

请告诉我从后台窗口到前台窗口进行通信的最佳方法是什么?

2 个答案:

答案 0 :(得分:0)

您的代码可能看起来像

void MainWindow::on_InsertButton_pressed()
{
    libinsert lib ;
    connect( this, SIGNAL( messageReceived( QString ), &lib, SLOT( letsChangeLineEdit( QString ) ) ) );
    lib.setModal(false);
    lib.exec();
}

当然你应该实现你的信号和插槽。信号槽参数中的QString是在对话框中显示的目标字符串。 希望能为你清楚。

答案 1 :(得分:0)

在你的MainWindow::on_InsertButton_pressed()槽中,你正在创建一个局部变量libinsert lib,它在超出范围时被破坏,即当槽执行完成时。如果使用lib.exec(),执行将等待对话框执行返回,以便您看到对话框,但在关闭它之前无法与主窗口进行交互。当你使用lib.show()时,会显示你的对话框,继续执行并立即离开插槽,此时lib被破坏而你再也看不到它了(取决于你的配置,这可能很快足以让它看起来更像是在第一时间显示出来了。)

一种解决方案是将指向对话框的指针作为MainWindow类的成员(在libinsert* lib;中添加MainWindow.h),并在Mainwindow构造函数中初始化它,如下所示:

`MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
 {
      ui->setupUi(this);
      lib = new libinsert(this);
      lib->setModal(false);
 }`

然后在MainWindow::on_InsertButton_pressed()中你只需要调用QWidget::show()方法,就像这样:

void MainWindow::on_InsertButton_pressed()
{
    lib->show();
}

现在,如果你想要实现的是每次收到消息时弹出一个对话框,并显示消息,首先你需要在{{1}中有一个公共方法(或插槽)更新libinsert中文本的类,例如

QLineEdit

然后在收到消息时直接调用此方法:

void libinsert::onMessageReceived(QString message)
{
     // Update the text and show the dialog to avoid having to call show() 
     //   explicitly from MainWindow.
     ui->lineEdit->setText(message);
     show(); 
 }

或者将收到消息时发出的信号连接到它(在MainWindow构造函数中):

lib->onMessageReceived(message);