qt5-入門-使用拖動方式創建Dialog

參考:
C++ GUI Programming with Qt 4, Second Edition

本地環境:
win10專業版,64位,Qt5.12


目錄

  • 實現效果
  • 基本流程
  • 逐步實操
    • 1)創建和初始化子部件
    • 2)把子部件放進布局中
    • 3)設置tab順序
    • 4)連接信號和槽 5)實現自定義的槽
  • 使用QDialogButtonBox
    • 拖動繪制
    • 代碼
  • 排錯
    • 設置了windowIcon但不顯示

實現效果

打碼的是logo。
在這里插入圖片描述

基本流程

創建dialog的流程:

  1. 創建和初始化子部件;
  2. 把子部件放進布局中;
  3. 設置tab順序;
  4. 連接信號和槽;
  5. 實現自定義的槽。

逐步實操

現在一步一步操作:

**注意:**我一開始是用Qt Creator的設計頁面做的,所以截圖都是設計頁面,但是Qt Creator沒有預覽,稍微有點不方便,因此第三步我換到Qt Designer了,操作是一樣的。

1)創建和初始化子部件

先新建一個dialog。
在這里插入圖片描述
然后打開設計頁面,放置幾個小組件,如下圖所示。不要在意對齊,后面會使用自動對齊:
在這里插入圖片描述
各個對象的名稱和所屬的類如下圖所示:
在這里插入圖片描述
需要修改的屬性有:

  • 左側是okButton,修改text為OK,設置enable為false,設置default為true。default表示按回車會觸發。
  • 右側是cancelButton,需改text為cancel

然后需要設置label的buddy是lineEdit。

點擊菜單欄-編輯-Edit buddies,然后左鍵點擊label,出現箭頭后拖動,連接到lineEdit上,如下圖所示。
在這里插入圖片描述
這樣buddy就設置成功了。點擊編輯菜單欄返回,也可以點擊上方的工具條:
在這里插入圖片描述

2)把子部件放進布局中

按住ctrl,然后依次選擇label和lineEdit,單擊工具條上的水平布局,此時布局成功:
在這里插入圖片描述
然后對spacer和兩個按鈕做水平布局。隨后,反選,單擊垂直布局:
在這里插入圖片描述
現在變成:
在這里插入圖片描述
可以看到,窗口大小似乎偏大,點擊工具條上的調整大小按鈕,變成了最優尺寸:
在這里插入圖片描述

3)設置tab順序

設置tab順序就是部件接受焦點(focus)的順序,點擊的是工具條上帶數字的灰色按鈕:
在這里插入圖片描述
因為想要預覽效果,我用Qt Designer打開了文件。

點擊窗體-預覽,可以看到各種風格下的效果。
在這里插入圖片描述
windowsvista風格:
在這里插入圖片描述

windows風格
在這里插入圖片描述

fushion風格
在這里插入圖片描述
那么如何套用這個格式呢?

在main.cpp中這樣寫:

#include <QApplication>
#include "ui_toolbasic.h"int main(int argc, char *argv[])
{QApplication a(argc, argv);Ui::toolBasic ui;QDialog *dialog = new QDialog;ui.setupUi(dialog);dialog->show();return a.exec();
}

顯示效果:logo顯示正確。
在這里插入圖片描述
代碼說明:
ui_toolbasic.h是前面拖動后自動產生的文件,打開可以看到很多關于布局、繪制的代碼:
在這里插入圖片描述

4)連接信號和槽 5)實現自定義的槽

要實現的效果:限制lineEdit的輸入格式,要求以字母開始,后跟一個數字,再跟0-2個數字。只有滿足要求時,OK按鈕才生效。
在這里插入圖片描述

main.cpp


#include <QApplication>
//#include "ui_toolbasic.h"
#include "toolbasic.h"int main(int argc, char *argv[])
{QApplication a(argc, argv);toolBasic* tb = new toolBasic;tb->show();return a.exec();
}

toolbasic.h

#ifndef TOOLBASIC_H
#define TOOLBASIC_H#include <QDialog>
// 增加ui這一行,第一步生成form時是沒有的
#include "ui_toolbasic.h"namespace Ui {
class toolBasic;
}// 聲明
class QWidget;class toolBasic : public QDialog, public Ui::toolBasic
{Q_OBJECTpublic://explicit toolBasic(QWidget *parent = nullptr);// 注釋掉自動生成的構造函數,重寫一個toolBasic(QWidget *parent = 0);~toolBasic();private:Ui::toolBasic *ui;
// 新增槽函數
private slots:void on_lineEdit_textChanged();};#endif // TOOLBASIC_H

toolBasic.cpp
需要注意的是, setupUi()會自動連接一些槽函數,只要槽函數滿足格式:on_objectName_signalName(),也就是會蔣objectNamesignalName()連接起來,不用另外寫。

因此,上面新增了槽函數on_lineEdit_textChanged()等于執行到setupUi()時,自動實現了這個連接:
connect(lineEdit, SIGNAL(textChanged(const QString &)), this, SLOT(on_lineEdit_textChanged()));

所以只需要實現這個槽函數,就能實現lineEdit內容改變后的自動處理過程。

#include "toolbasic.h"
#include <QRegularExpressionValidator>
#include <QWidget>toolBasic::toolBasic(QWidget *parent) :QDialog(parent),ui(new Ui::toolBasic)
{// setupUi()會自動連接一些槽函數,只要槽函數滿足格式:on_objectName_signalName()setupUi(this);// 要求:以字母開頭,后跟一個數字(1-9),然后跟0-2個數字(0-9)QRegularExpression regExp("[A-Za-z][1-9][0-9]{0,2}");lineEdit->setValidator(new QRegularExpressionValidator(regExp, this));// 把okButton連到QDialog::accept()槽函數. // accept()關閉對話框,但是設置dialog的結果是QDialog::Accepted,也就是1connect(okButton, SIGNAL(clicked()), this, SLOT(accept()));// 把cancelButton連到QDialog::reject()// reject()也關閉對話框,但是設置結果為QDialog::Rejected,也就是0connect(cancelButton, SIGNAL(clicked()), this, SLOT(reject()));}toolBasic::~toolBasic()
{delete ui;
}void toolBasic::on_lineEdit_textChanged() {// lineEdit有合法輸入時,開啟ok按鈕okButton->setEnabled(lineEdit->hasAcceptableInput());
}

使用QDialogButtonBox

效果:
在這里插入圖片描述
在創建界面時選擇:Dialog with Buttons Bottom,起名myDialog。 (不要用這個,會報錯)diyDialog。

拖動繪制

與前面相似,就是兩個button變成了一個buttonBox。如果需要特殊一點的對齊,需要把預先出現在面板上的buttonBox刪掉,不然spacer是放不好的。如果不刪的話,上面兩個connect也是自動實現了的,不用寫。

另外,調整最佳尺寸的按鈕會失效,需要手動調整尺寸。(自動的會很小,因為只有兩個小組件)
在這里插入圖片描述

代碼

diydialog.h和main.cpp跟前面類似,不再重復。diydialog.cpp需要做一點修改:

#include <QRegularExpressionValidator>
#include <QWidget>
#include <QPushButton>
#include <QDialogButtonBox>
#include "diydialog.h"diyDialog::diyDialog(QWidget *parent) :QDialog(parent)
{setupUi(this);QRegularExpression regExp("[A-Za-z][1-9][0-9]{0,2}");lineEdit->setValidator(new QRegularExpressionValidator(regExp, this));// 這里需要修改connect(buttonBox, SIGNAL(accepted()), this, SLOT(accept()));connect(buttonBox, SIGNAL(rejected()), this, SLOT(reject()));
}diyDialog::~diyDialog()
{delete ui;
}void diyDialog::on_lineEdit_textChanged(){// 修改buttonBox->button(QDialogButtonBox::Ok)->setEnabled(lineEdit->hasAcceptableInput());
}

注意,如果buttonBox->button這里提示invalid use of incomplete type 'class QPushButton',可能是沒有引入<QPushButton>的原因,include上就解決了。
在這里插入圖片描述

排錯

設置了windowIcon但不顯示

可能有問題的地方:

  1. 前綴寫錯

  2. 使用了錯誤的文件格式
    icon不支持ico格式,換成jpg或者png即可。

  3. 使用拖動方式,在designer中設置icon時,要選選擇資源,不要選選擇文件!!
    在這里插入圖片描述

  4. 圖片文件的路徑寫錯
    在這篇文章里qt5-入門-信號槽理解+QMainWindow,我的路徑是這樣寫的:openAction->setIcon(QIcon(":/pic.jpg"));,但是我現在把文件放到專門的文件夾下了,文件結構如下圖:
    在這里插入圖片描述
    如果直接寫:/resources/img/xxx_logo.png,其實是訪問不到的。更簡單的方法是editor中查看res.qrc,右鍵復制path,可以看到復制結果是:://resources/img/xxx_logo.png,然后直接在代碼里寫:

    this->setWindowIcon(QIcon("://resources/img/xxx_logo.png"));
    

    在這里插入圖片描述

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

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

相關文章

jstat命令查看jvm的GC信息

文章目錄 前言jstat命令查看jvm的GC信息1. 概述2. 應用堆內存水位閥值大小怎么確定3. 使用 jps 命令查看 Java 進程的進程號&#xff08;PID&#xff09;![在這里插入圖片描述](https://img-blog.csdnimg.cn/direct/5097401443314e9d808a83b694dbc6e5.png)4. jstat用法5. 類加載…

UE4 Niagara 關卡3.1官方案例解析二

自己嘗試做做&#xff0c;打亂順序 1、新建空的niagara system&#xff0c;添加空的發射器。更換渲染器為網格體渲染器并添加網格體。 2、發射器更新里面添加Spawn Rate&#xff0c;發射個粒子看看 效果圖&#xff1a; 3、采樣靜態網格體&#xff0c;網格體粒子出生于靜態網格…

【排序算法】基數排序

一&#xff1a;基本概念 1.1 基數排序(桶排序)介紹 基數排序&#xff08;radix sort&#xff09;屬于“分配式排序”&#xff08;distribution sort&#xff09;&#xff0c;又稱“桶子法”&#xff08;bucket sort&#xff09;或bin sort&#xff0c;顧名思義&#xff0c;它是…

【圖說】電腦發展史

免責聲明:文中有一些圖片來源自網絡,如有版權請通知我刪除,謝謝! “結繩記事”是計算的開端 如果說“結繩記事”僅是計數,那么“算籌”就是真正的計算工具 算盤也是我們老祖宗的杰出發明,最擅長“加減乘除”,包括但不限于乘方、開方、對數等。還能進行開發智力的“珠心算…

鼠標失靈怎么辦?電腦出現鼠標失靈的詳細處理方法介紹

無論是筆記本電腦還是臺式機電腦&#xff0c;鼠標是必不可少的外設之一&#xff0c;而我們在使用電腦的過程中&#xff0c;經常回遇到鼠標突然失靈了&#xff0c;不聽使喚&#xff0c;控制不了&#xff0c;接下小編來與大家一起分享&#xff0c;遇到這種情況我們該怎么辦 有時…

C語言學習筆記(二)

C語言學習 學習筆記(一) 學習筆記(二&#xff09; 文章目錄 C語言學習一、C語言中的數據類型進制二進制八進制十六進制進制轉換表 單位換算尋址 數據類型基本類型整數類型整數的有符號和無符號實數類型字符型 構造類型指針類型空類型總結 常量直接常量符號常量轉義符 符號常量…

Python并發編程:多線程-GIL全局解釋器鎖

一 引子 在Cpython解釋器中&#xff0c;同一個進程下開啟的多線程&#xff0c;同一時刻只能有一個線程執行&#xff0c;無法利用多核優勢首先&#xff1a;需要明確的一點是GIL并不是Python的特性&#xff0c;它是在實現Python解析器(CPython)時所引入的一個概念。就好比c是一套…

協議(網絡協議)

HTTP/HTTPS 協議 HTTP 實際上是個縮寫&#xff0c;英文全稱是&#xff1a;Hyper Text Transfer Protocol &#xff08;超文本傳輸協議&#xff09;。 最常用的網頁&#xff08;也叫web頁&#xff09;就是一種超文本的具體表現形式。HTTPS &#xff08;全稱&#xff1a;Hyper …

美團-放水果

題目&#xff1a; 放水果 把M個相同的水果放在N個同樣的盤子里&#xff0c;允許有的盤子空著不放&#xff0c;問不同的放法數K是多少&#xff1f;請注意&#xff0c;5&#xff0c;1&#xff0c;1和1&#xff0c;5&#xff0c;1 是同一種放法。輸入描述 第一行是測試數據的數目…

【Spring】19 @Autowired注解使用詳解

文章目錄 構造函數注入Setter方法注入字段注入數組和集合注入特殊情況處理特殊接口類型的注入異常處理結語 Spring 框架的 Autowired 注解是實現依賴注入的一種強大而靈活的方式。在本文中&#xff0c;我們將介紹 Autowired 注解的多種用法&#xff0c;包括構造函數、setter方法…

ICASSP2024 | ICMC-ASR 車載多通道語音識別挑戰賽總結

為促進駕駛場景中語音處理和識別研究&#xff0c;在ISCSLP 2022上成功舉辦智能駕駛座艙語音識別挑戰 (ICSRC)的基礎上&#xff0c;西工大音頻語音與語言處理研究組 (ASLPNPU)聯合理想汽車、希爾貝殼、WeNet社區、字節、微軟、天津大學、南洋理工大學以及中國信息通信研究院等多…

EMO在哪體驗?阿里對口型視頻生成工具EMO下載地址?阿里巴巴新模型EMO的技術原理

這幾天&#xff0c;阿里的對口型視頻生成工具EMO火了。根據官方宣傳&#xff0c;EMO只需要上傳一張圖片和一段音頻就可以一鍵生成對口型視頻&#xff0c;而且視頻中的嘴型還可以與聲音匹配。這項技術支持多語言、對話、唱歌以及快速語速的適配&#xff0c;但也可能成為制造虛假…

pip降級在pycharm中

PyCharm依賴于"–build-dir"參數安裝第三方庫&#xff0c;但該參數在最新的23.0版pip中已刪除 解決辦法就是降級pip&#xff0c;PyCharm中選擇File&#xff0c;找到編譯器&#xff0c;點擊pip&#xff0c;勾選對應版本即可 或者在cmd中執行運行python -m pip install…

基于centos的linux上docker安裝,及mysql、redis等應用在docker容器中的安裝

Docker環境安裝 安裝yum-utils&#xff1a; yum install ‐y yum‐utils device‐mapper‐persistent‐data lvm2為yum源添加docker倉庫位置&#xff1a; yum‐config‐manager ‐‐add‐repo https://download.docker.com/linux/centos/docker‐ce.repo如果上面執行命令后…

【matlab】matlab隨機函數-rand

matlab中rand相關的隨機函數包括rand(),randn(),randi()等。相關用法如下&#xff1a; 1&#xff0c;rand(m,n) 含義&#xff1a;生成0-1間均勻分布的隨機矩陣(m行&#xff0c;n列)&#xff0c;如果mn&#xff0c;則可簡寫為rand(m) >> rand(1) ans 0.8147 ----------…

Linux系統中的高級多線程編程技術

在Linux系統中&#xff0c;多線程編程是一種常見的并發編程模型&#xff0c;通過利用多線程可以實現程序的并發執行&#xff0c;提高系統的性能和響應速度。在Linux系統中&#xff0c;開發人員通常使用 pthread 庫來進行多線程編程&#xff0c;同時需要掌握線程同步技術以避免并…

JVM(4)

垃圾回收問題 垃圾回收算法 通過之前的學習我們可以將死亡對象標記出來了,標記出來后我們就可以進行垃圾回收操作了,在正式學習垃圾處理器之前,我們先來看一下垃圾回收器使用的幾種算法. 標記-清除算法 "標記-清除"算法是基礎的收集算法.算法分為"標記"…

「Vue3系列」Vue3指令

文章目錄 一、Vue3 指令二、注冊-自定義指令三、常見自定義指令1. 聚焦指令&#xff08;v-focus&#xff09;2. 高亮指令&#xff08;v-highlight&#xff09;3. 防抖指令&#xff08;v-debounce&#xff09;4. 限制輸入指令&#xff08;v-limit&#xff09;使用注意事項 四、相…

WPF中如何設置自定義控件

1.圓角按鈕的設置&#xff1a; 眾所周知在WPF中自帶有提示信息&#xff0c;當我問創建Button時&#xff0c;點擊空格出現如下可選設置 帶有小扳手&#x1f527;圖標為相應的屬性&#xff0c;如果Button有CornerRadius&#xff08;角半徑&#xff09;屬性就能夠直接設置Button實…

33. 【Linux教程】Linux 用戶組

前面小節介紹了 Linux 用戶相關的增刪改查&#xff0c;本小節介紹 Linux 用戶組&#xff0c;Linux 系統中采取了一種安全機制&#xff08;即用戶組&#xff09;&#xff0c;用戶組可以允許多個 Linux 用戶共享同一種權限。 1. 用戶組介紹 Linux 是多任務多用戶的操作系統&…