我正在开发一个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 窗口不会弹出。
请告诉我从后台窗口到前台窗口进行通信的最佳方法是什么?
答案 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);