Qt 入門 3 之對話框 QDialog

Qt 入門 3 之對話框 QDialog

本文從以下幾點分開講述:
- 對話框的基本原理介紹
- 兩種不同類型的對話框
- 一個由多個窗口組成并且窗口間可以相互切換的程序

1.模態和非模態對話框

  • QDialog 類是所有對話框窗口類的基類。對話框窗口是一個經常用來完成短小任務或者和用戶進行簡單交互的頂層窗口
  • 按照運行對話框時是否還可以和該程序的其他窗口進行交互,對話框常被分為兩類:模態的(model) 和非模態的(modeless)。
  • 新建Qt Qwidgets應用項目,名稱為mydialog1,然后項目中命名如下圖,找到
mywidget.cpp文件添加一下代碼:
#include "mywidget.h"
#include "ui_mywidget.h"
#include"qdialog.h"MyWidget::MyWidget(QWidget *parent): QWidget(parent), ui(new Ui::MyWidget)
{ui->setupUi(this);QDialog dialog(this);dialog.show();
}

在這里插入圖片描述

  • 在 MyWidget 類的構造函數中定義了一個QDialog類對象,還指定了 dialog的父窗口為 MyWidget 類對象(即this參數的作用),最后調用show()函數讓其顯示。運行程序時就發現,一個窗口一閃而過,然后就只顯示MyWidget窗口了,為什么會這樣呢?因為對于一個函數中定義的變量,等這個函數執行結束后,它就會自動釋放。也就是說,這里的 dialog對象只在這個構造函數中有用,等這個構造函數執行完了,dialog也就消失了。為了不讓dialog消失,可以將QDialog對象的創建代碼更改如下:
    QDialog* dialog = new QDialog(this);dialog->setWindowTitle(QObject::tr("dialog1"));dialog->show();
  • 可以正常顯示了。需要說明的是,我們說定義一個對象是指“QDialog dialog;”這樣的方式,而像“QDialog *dialog;“這樣不能被稱為定義了一個對象,而應該說成定義了一個指向QDialog類對象的指針變量。后面也會把“QDialog *dialog;"說成是定義了一個QDialog對象。再補充一點,這里為對話框對象指明了父窗口,所以就沒有必要使用delete來釋放該對象了
    在這里插入圖片描述
    其實不用指針也可讓對話框顯示出來,可以將代碼修改如下:
    QDialog dialog(this);dialog.exec();
  • 這時運行程序就會發現對話框彈出來了,但是MyWidget(MyWidget)窗口并沒有出來,當關閉對話框后,MyWidget窗口才彈出來。這個對話框與前面那個對話框的效果不同,稱它為模態對話框,而前面那種對話框稱為非模態對話框。
  • 模態對話框就是在沒有關閉它之前,不能再與同一個應用程序的其他窗口進行交互,比如新建項目時彈出的對話框。而對于非模態對話框,既可以與它交互,也可以與同一程序中的其他窗口交互,如Microsoft Word中的查找替換對話框。就像前面看到的,要想使一個對話框成為模態對話框,則只需要調用它的exec()函數;而要使其成為非模態對話框,則可以使用new操作來創建,然后使用show()函數來顯示。其實使用show()函數也可以建立模態對話框,只須在其前面使用setModal()函數即可。例如:
QDialog * dialog = new QDialog(this);
dialog->setModal(true);
dialog->show();  
  • 運行程序后可以看到,生成的對話框是模態的。但是,它與用exec()函數時的效果是不一樣的,因為現在的MyWidget窗口也顯示出來了。這是因為調用完show()函數后會立即將控制權交給調用者,程序可以繼續往下執行。而調用exec()數卻不同,只有當對話框被關閉時才會返回。與setModal()函數相似的還有一個setWindowModality()函數,它有一個參數來設置模態對話框要阻塞的窗口類型,可以是Qt::NonModal(不阻塞任何窗口,就是非模態)、Qt::WindowModal(阻塞它的父窗口、所有祖先窗口以及它們的子窗口)或Qt::ApplicationModal(阻塞整個應用程序的所有窗口)。而setModal()函數默認設置的是Qt::ApplicationModal。

2.多窗口切換

2.1 認識信號與槽

  • Qt中使用信號與槽機制來完成對象之間的協同操作
  • 簡單來說,信號和槽都是函數,比如單擊窗口上的一個按鈕后想要彈出一個對話框,那么可以將這個按鈕的單擊信號和自定義相關的槽關聯起來,在這個槽中創建一個對話框來顯示它
  • 舉個例子,在之前的項目中做出如下更改:
    • 在mywidget.h中加入槽函數 定義:
public:void showChildDialog();
- 在mywidget.cpp中添加槽函數定義
void MyWidget::showchildDialog()
{QDialog* dialog = new QDialog(this);dialog->show();
}
- 在mywidget.cpp 基類構造函數中添加connect函數:
connect(ui->showchildButton,&OPushButton::clicked,this, &MyWidget::showchildDialog);
  • 然后點擊mywidget.ui做出如下界面編輯操作:新拉一個pushputton并更改按鈕名和顯示文本,新拉一個label并更改顯示本文
    在這里插入圖片描述

  • 上述更改主要想實現以下功能:點擊 按鈕 則顯示新的子窗口
    在這里插入圖片描述

  • connect函數詳解,其時QObject類中的函數,因為QWidget繼承自QObject,因此可以直接使用

  • 函數4個參數分別對應:發射信號的對象、發射的信號、接收信號的對象、要執行的槽

  • 上述信號與槽的連接成為手動關聯,還有一種是自動關聯,比如前邊的槽函數可以重命名為 on_showChildButton_clicked(),就是由字符on 、發射信號的部件對象名和信號名組成

2.2 自定義對話框

  • 依然在前邊的項目中更改:

  • 第一步,添加自定義對話類框。依然在前面的項目中更改。首先向該項目中添加Qt設計師界面類。界面模板選擇DialogwithoutButtons,類名改為MyDialog。然后在設計模式中向窗口添加兩個PushButton,并且分別更改其顯示文本為“進人主界面”和“退出程序”
    在這里插入圖片描述

  • 第二步,設計信號與槽。這里使用設計器來實現”退出程序" 按鈕的信號和槽的關聯。單擊設計器上方的Edit Signals/Slots圖標,或者按下快捷鍵F4,于是進入了部件的信號和槽的編輯模式。在“退出程序”按鈕上按住鼠標左鍵,然后拖動到窗口界面上,這時松開鼠標左鍵。在彈出的配置連接對話框中選擇“顯示從QWidget繼承的信號和槽”選項,然后在左邊的QPushButton欄中選擇信號clicked(),在右邊的 QDialog欄中選擇對應的槽close(),完成后單擊OK按鈕

  • 如圖下圖所示(這里還可以單擊“編輯”按鈕添加自定義的槽,不過這還需要在MyDialog類中實現該槽)。這時“退出程序”按鈕的單擊信號就和對話框中的關閉操作槽進行了關聯。要想取消這個關聯,只須在信號和槽編輯模式中選擇這個關聯;當它變為紅色時,按下Delete鍵,或者右擊選擇“刪除”。也可以在設計器下方的信號和槽編輯器中看到設置好的關聯。當然,直接在信號和槽編輯器中建立關聯也是可以的,它與鼠標選擇部件進行關聯是等效的。設置好關聯后按下F3鍵,或者單擊“編輯控件”圖標,則回到部件編輯模式。
    在這里插入圖片描述

  • 現在設置“進人主界面”按鈕的信號和槽的關聯。在該按鈕上右擊,在彈出的級聯菜單中選擇“轉到槽”,然后在彈出的對話框中選擇clicked()信號,并單擊OK按鈕。這時便會進人代碼編輯模式,并且定位到自動生成的on_pushButton_clicked()槽中在其中添加代碼:
    在這里插入圖片描述

void MyDialog::on_pushButton_clicked()
{accept();
}
  • 這個 accept()函數是 QDialog類中的一個槽,對于一個使用exec()函數實現的模態對話框,執行了這個槽就會隱藏這個模態對話框,并返回QDialog::Accepted值,這里就是要使用這個值來判斷是哪個按鈕被按下了。與其對應的還有一個**reject()**槽,它可以返回一個 QDialog::Rejected值,前面的“退出程序”按鈕也可以關聯這個槽。
  • 在主界面中使用自定義的對話框,更改 main 函數如下:
#include "mywidget.h"
#include"mydialog.h"
#include <QApplication>
int main(int argc, char *argv[])
{QApplication a(argc, argv);MyWidget w;//w.show();//return a.exec;MyDialog dialog;if(dialog.exec()==QDialog::Accepted){w.show();return a.exec();}else{return 0 ;}
}
  • 運行程序后可以發現,已經實現了從錄對話框到主界面,再從主界面顯示一個對話框的應用了。執行后效果如下:

1744004049407

  • 再來實現可以從主界面重新進入登錄界面的功能。雙擊mywidget.ui文件,在設計模式中再向界面添加兩個PushButton,分別更改它們的顯示文本為“重新登錄”和“退出”。然后使用信號和槽模式將“退出”按鈕的clicked()信號和MyWidget 界面的**close()槽關聯。完成后再轉到“重新登錄”按鈕的clicked()**信號的槽,并更改如下:

在這里插入圖片描述

void MyWidget::on_pushButton _clicked()
{//先關閉界面,其實是隱藏了,并沒有真正退出,然年新建MyDialog對象close();MyDialog dlg;//如果按下了[重新登錄]按鈕,則再次顯示主界面if(dlg.exec()==QDialog::Accepted)show();
}

運行后效果如下:

1744004593360

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/76592.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/76592.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/76592.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

數據結構——哈希技術及鏈地址法

目錄 一、哈希的定義 二、哈希沖突定義 三、構造哈希函數的方法 四、四種解決哈希沖突的方法 4.1 開放地址法 4.2 鏈地址法 4.3 再散列函數法 4.4 公共區溢出法 五、鏈地址法結構體設計 六、基本操作的實現 6.1 哈希函數 6.2 初始化 6.3 插入值 6.4 刪除值 6.5 查…

算法思想之前綴和(二)

歡迎拜訪&#xff1a;霧里看山-CSDN博客 本篇主題&#xff1a;算法思想之前綴和(二) 發布時間&#xff1a;2025.4.11 隸屬專欄&#xff1a;算法 目錄 滑動窗口算法介紹核心思想大致步驟 例題和為 K 的子數組題目鏈接題目描述算法思路代碼實現 和可被 K 整除的子數組題目鏈接題目…

開源的7B參數OCR視覺大模型:RolmOCR

1. 背景介紹 早些時候&#xff0c;Allen Institute for AI 發布了 olmOCR&#xff0c;這是一個基于 Qwen2-VL-7B 視覺語言模型&#xff08;VLM&#xff09;的開源工具&#xff0c;用于處理 PDF 和其他復雜文檔的 OCR&#xff08;光學字符識別&#xff09;。開發團隊對該工具的…

移動端六大語言速記:第14部分 - 數據庫操作

移動端六大語言速記:第14部分 - 數據庫操作 本文將對比Java、Kotlin、Flutter(Dart)、Python、ArkTS和Swift這六種移動端開發語言在數據庫操作方面的特性,幫助開發者理解和掌握各語言的數據庫編程能力。 14. 數據庫操作 14.1 SQL查詢 各語言SQL查詢實現方式對比: 特性Ja…

有哪些反爬機制可能會影響Python爬取視頻?如何應對這些機制?

文章目錄 前言常見反爬機制及影響1. IP 封禁2. 驗證碼3. 請求頭驗證4. 動態加載5. 加密與混淆6. 行為分析 應對方法1. 應對 IP 封禁2. 應對驗證碼3. 應對請求頭驗證4. 應對動態加載5. 應對加密與混淆6. 應對行為分析 前言 在使用 Python 爬取視頻時&#xff0c;會遇到多種反爬…

ESP32開發入門:基于VSCode+PlatformIO環境搭建指南

前言 ESP32作為一款功能強大的物聯網開發芯片&#xff0c;結合PlatformIO這一現代化嵌入式開發平臺&#xff0c;可以大幅提升開發效率。本文將詳細介紹如何在VSCode中搭建ESP32開發環境&#xff0c;并分享實用開發技巧。 一、環境安裝&#xff08;Windows/macOS/Linux&#xf…

DeepSeek:穿透行業知識壁壘的搜索引擎攻防戰

DeepSeek&#xff1a;穿透行業知識壁壘的搜索引擎攻防戰 文 / 產業智能觀察組&#xff08;人機協同創作&#xff09; 一、搜索引擎的"認知折疊"危機 2024年Q1數據顯示&#xff0c;百度搜索結果前10頁中&#xff0c;61.7%的內容存在"偽專業化"現象——看似…

SQL 外鍵(Foreign Key)詳細講解

1. 什么是外鍵&#xff1f;?? ??定義??&#xff1a;外鍵是數據庫表中的一列&#xff08;或一組列&#xff09;&#xff0c;用于??建立兩個表之間的關聯關系??。外鍵的值必須匹配另一個表的主鍵&#xff08;Primary Key&#xff09;或唯一約束&#xff08;Unique Con…

5G中的DU和CU的作用

在5G網絡架構中&#xff0c;CU&#xff08;Centralized Unit&#xff0c;集中單元&#xff09; 和 DU&#xff08;Distributed Unit&#xff0c;分布單元&#xff09; 是無線接入網&#xff08;RAN&#xff09;的重要組成部分&#xff0c;它們的分工和作用如下&#xff1a; 1.…

深度解析 n8n:強大的開源工作流自動化平臺

在數字化時代&#xff0c;企業和個人面臨著日益復雜的工作流程和多樣化的應用工具&#xff0c;如何高效整合這些資源、實現工作流的自動化成為提升效率的關鍵。n8n 作為一款開源的工作流自動化平臺&#xff0c;憑借其強大的功能、廣泛的應用集成能力和靈活的部署方式&#xff0…

ruby超高級語法

以下是 Ruby 中一些 極度硬核 的語法和底層特性&#xff0c;涉及元編程的深淵、虛擬機原理、語法黑魔法等&#xff0c;適用于追求極限的 Ruby 開發者&#xff1a; 高級語法一 一、語法核彈級操作 1. 動態修改繼承鏈 class A; def foo; "A"; end end class B; def …

flutter 獲取通話記錄和通訊錄

Dart SDK version is 3.7.01 dependencies:flutter:sdk: flutterpermission_handler: ^11.0.1 # 權限管理flutter_contacts: ^1.1.92call_log: ^5.0.5cupertino_icons: ^1.0.8dev_dependencies:flutter_test:sdk: flutterflutter_lints: ^5.0.0 2 contact_and_calls_page.da…

bash腳本手動清空mysql表數據

文章目錄 1、bash腳本手動清空mysql表數據 1、bash腳本手動清空mysql表數據 #!/bin/bash# 配置區域&#xff08;修改此處&#xff09; MYSQL_USER"root" MYSQL_PASSWORD"123456" MYSQL_HOST"localhost" DATABASES("hps-base:base_test_ite…

Spark Core編程

一文讀懂Spark Core編程核心要點 最近在學習大數據處理框架Spark&#xff0c;今天來給大家分享一下Spark Core編程中非常重要的內容&#xff0c;包括RDD算子、累加器和廣播變量&#xff0c;希望能幫助大家更好地理解和掌握Spark編程。先來說說RDD算子&#xff0c;它是Spark編程…

SDP(一)

SDP(Session Description Protocol)會話描述協議相關參數 Session Description Protocol Version (v): 0 --說明&#xff1a;SDP當前版本號 Owner/Creator, Session Id (o): - 20045 20045 IN IP4 192.168.0.0 --說明&#xff1a;發起者/創建者 會話ID&#xff0c;那么該I…

HarmonyOS:組件布局保存至相冊

一&#xff0c;需求背景 有這樣一個需求&#xff0c;將頁面上的某個自定義組件以圖片的形式保存至相冊。 二&#xff0c;需求拆解 根據需求分析&#xff0c;可將需求拆解成兩步&#xff1a; 1&#xff0c;將組件轉換成圖片資源&#xff1b; 2&#xff0c;將圖片保存到相冊…

算法中的數論基礎

算法中的數論基礎 本篇文章適用于算法考試或比賽之前的臨場復習記憶&#xff0c;沒有復雜公式推理&#xff0c;基本上是知識點以及函數模版&#xff0c;涵蓋取模操作、位運算的小技巧、組合數、概率期望、進制轉換、最大公約數、最小公倍數、唯一分解定理、素數、快速冪等知識…

Redis下載穩定版本5.0.4

https://www.redis.net.cn/download/ Redis下載 Redis 版本號采用標準慣例:主版本號.副版本號.補丁級別,一個副版本號就標記為一個標準發行版本,例如 1.2,2.0,2.2,2.4,2.6,2.8,奇數的副版本號用來表示非標準版本,例如2.9.x發行版本是Redis 3.0標準版本的非標準發行版本…

?UniApp 安卓打包完整步驟(小白向)

? ?一、環境準備? ?安裝 HBuilderX? 下載最新版 HBuilderX 并安裝&#xff08;官方 IDE&#xff0c;支持一鍵打包&#xff09;?16確保已安裝 Node.js&#xff08;用于依賴管理&#xff09;?26 ?配置 Android 開發環境? 安裝 ?Java JDK 17?&#xff08;建議選擇穩定…

【Springboot知識】Springboot配置加載機制深入解讀

文章目錄 配置加載概述**Spring Boot 配置加載機制詳解****一、配置加載順序&#xff08;優先級由低到高&#xff09;****二、關鍵配置機制說明****1. Profile 機制****2. 外部化配置****3. 配置屬性綁定到 Bean****4. 動態覆蓋配置** **三、配置加載流程圖****2. 配置導入&…