<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                ThinkChat2.0新版上線,更智能更精彩,支持會話、畫圖、視頻、閱讀、搜索等,送10W Token,即刻開啟你的AI之旅 廣告
                #(14):對話框數據傳遞 對話框的出現用于完成一個簡單的或者是短期的任務。對話框與主窗口之間的數據交互相當重要。本節將講解如何在對話框和主窗口之間進行數據交互。按照前文的講解,對話框分為模態和非模態兩種。我們也將以這兩種為例,分別進行闡述。 模態對話框使用了`exec()`函數將其顯示出來。`exec()`函數的真正含義是開啟一個新的事件循環(我們會在后面的章節中詳細介紹有關事件的概念)。所謂事件循環,可以理解成一個無限循環。Qt 在開啟了事件循環之后,系統發出的各種事件才能夠被程序監聽到。這個事件循環相當于一種輪詢的作用。既然是無限循環,當然在開啟了事件循環的地方,代碼就會被阻塞,后面的語句也就不會被執行到。因此,對于使用了`exec()`顯示的模態對話框,我們可以在`exec()`函數之后直接從對話框的對象獲取到數據值。 看一下下面的代碼: ~~~ void MainWindow::open() { QDialog dialog(this); dialog.setWindowTitle(tr("Hello, dialog!")); dialog.exec(); qDebug() << dialog.result(); } ~~~ 上面的代碼中,我們使用`exec()`顯示一個模態對話框。最后一行代碼,`qDebug()`類似于`std::cout`或者 Java 的`System.out.println();`語句,將后面的信息輸出到標準輸出,一般就是控制臺。使用`qDebug()`需要引入頭文件。在`exec()`函數之后,我們直接可以獲取到 dialog 的數據值。注意,`exec()`開始了一個事件循環,代碼被阻塞到這里。由于`exec()`函數沒有返回,因此下面的`result()`函數也就不會被執行。直到對話框關閉,`exec()`函數返回,此時,我們就可以取得對話框的數據。 需要注意的一點是,如果我們設置 dialog 的屬性為`WA_DeleteOnClose`,那么當對話框關閉時,對象被銷毀,我們就不能使用這種辦法獲取數據了。在這種情況下,我們可以考慮使用 parent 指針的方式構建對話框,避免設置`WA_DeleteOnClose`屬性;或者是利用另外的方式。 實際上,`QDialog::exec()`是有返回值的,其返回值是`QDialog::Accepted`或者`QDialog::Rejected`。一般我們會使用類似下面的代碼: ~~~ QDialog dialog(this); if (dialog.exec() == QDialog::Accepted) { // do something } else { // do something else } ~~~ 來判斷對話框的返回值,也就是用戶是點擊了“確定”還是“取消”。更多細節請參考`QDialog`文檔。 模態對話框相對簡單,如果是非模態對話框,`QDialog::show()`函數會立即返回,如果我們也這么寫,就不可能取得用戶輸入的數據。因為`show()`函數不會阻塞主線程,`show()`立即返回,用戶還沒有來得及輸入,就要執行后面的代碼,當然是不會有正確結果的。那么我們就應該換一種思路獲取數據,那就是使用信號槽機制。 由于非模態對話框在關閉時可以調用`QDialog::accept()`或者`QDialog::reject()`或者更通用的`QDialog::done()`函數,所以我們可以在這里發出信號。另外,如果找不到合適的信號發出點,我們可以重寫`QDialog::closeEvent()`函數,在這里發出信號。在需要接收數據的窗口(這里是主窗口)連接到這個信號即可。類似的代碼片段如下所示: ~~~ //!!! Qt 5 // in dialog: void UserAgeDialog::accept() { emit userAgeChanged(newAge); // newAge is an int QDialog::accept(); } // in main window: void MainWindow::showUserAgeDialog() { UserAgeDialog *dialog = new UserAgeDialog(this); connect(dialog, &UserAgeDialog::userAgeChanged, this, &MainWindow::setUserAge); dialog->show(); } // ... void MainWindow::setUserAge(int age) { userAge = age; } ~~~ 上面的代碼很簡單,這里不再贅述。另外,上述代碼的 Qt 4 版本也應該可以很容易地實現。 不要擔心如果對話框關閉,是不是還能獲取到數據。因為 Qt 信號槽的機制保證,在槽函數在調用的時候,我們始終可以使用`sender()`函數獲取到 signal 的發出者。關于`sender()`函數,可以在文檔中找到更多的介紹。順便說一句,`sender()`函數的存在使我們可以利用這個函數,來實現一個只能打開一個的非模態對話框(方法就是在對話框打開時在一個對話框映射表中記錄下標記,在對話框關閉時利用`sender()`函數判斷是不是該對話框,然后從映射表中將其刪除)。
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看