[英]Interaction between QMainWindow class and QDialogue class
我正在開發一個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進行交互。 我嘗試使用lib.show()而不是lib.exec() ,但是與此同時 ,當我單擊按鈕QMainWindow類時,不會彈出QDialogue窗口。
請告訴我從后台窗口與前台窗口進行通信的最佳方法是什么?
您的代碼看起來像
void MainWindow::on_InsertButton_pressed()
{
libinsert lib ;
connect( this, SIGNAL( messageReceived( QString ), &lib, SLOT( letsChangeLineEdit( QString ) ) ) );
lib.setModal(false);
lib.exec();
}
當然,您應該實現信號和插槽。 信號插槽參數中的QString是要在對話框中顯示的目標字符串。 希望能為您清除。
在您的MainWindow::on_InsertButton_pressed()
插槽中,您正在創建一個局部變量libinsert lib,該變量在超出范圍(即,插槽執行完成)時將被銷毀。 如果使用lib.exec()
則執行將等待對話框執行返回,以便您看到對話框,但在將其關閉之前無法與主窗口進行交互。 當您使用lib.show()
,將顯示對話框,執行將繼續並立即退出插槽,這時lib被銷毀,您將不再看到它(根據您的配置,此速度可能足夠快,看起來它會首先顯示更新的內容)。
一種解決方案是將指向對話框的指針作為MainWindow類的成員(在MainWindow.h)
添加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();
}
現在,如果要實現的目標是每次接收到消息時彈出一個對話框並顯示消息,那么首先,您的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();
}
然后,當您收到消息時,直接使用以下方法調用此方法:
lib->onMessageReceived(message);
或使用以下方式將在收到消息時發出的信號連接到它(在MainWindow構造函數中):
connect( this, SIGNAL( messageReceived( QString ), &lib, SLOT( onMessageReceived( QString ) ) ) );
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.