簡體   English   中英

QMainWindow類和QDialogue類之間的交互

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM