?
控件概述
編程講究的是 --- 站在巨人的肩膀上 --- 不是編寫一個圖形化界面上的內容 --- Qt 已經提供了很多控件了!!!提高圖形化界面的開發效率!!!重點變成我們怎么使用這些已有的控件!?
Widget 是 Qt 中的核心概念,英文原義是“小部件”,此處翻譯為“控件”。控件是構成圖形化界面的基本要素,如按鈕、列表視圖、樹形視圖、單行輸入框、多行輸入框、滾動條、下拉框等都屬于控件。
Qt 作為成熟的 GUI 開發框架,內置大量常用控件,且可通過 Qt Designer 看到。Qt 還支持自定義控件,以滿足特定需求。
分類 | 子控件類型 |
---|---|
Layouts(布局) | Vertical Layout(垂直布局), Horizontal Layout(水平布局), Grid Layout(網格布局), Form Layout(表單布局) |
Spacers(間隔器) | |
Buttons(按鈕) | Push Button(按鈕), Tool Button(工具按鈕), Radio Button(單選按鈕), Check Box(復選框), Command Button(命令按鈕), Dialog Button(對話框按鈕) |
Item Views(項視圖) | List View(列表視圖), Tree View(樹形視圖), Table View(表格視圖), Column View(列視圖), List Widget(列表控件), Tree Widget(樹形控件), Table Widget(表格控件) |
Containers(容器) | Group Box(分組框), Scroll Area(滾動區域), Tool Box(工具箱), Tab Widget(標簽控件), Stacked Widget(堆疊控件), Frame(框架), Widget(控件), MDI Area(MDI區域), Dock Widget(停靠控件), QaxWidget(Qax控件) |
Input Widgets(輸入控件) | Combo Box(組合框), Font Combo Box(字體組合框), Line Edit(行編輯框), Text Edit(文本編輯框), Plain Text Edit(純文本編輯框), Spin Box(微調框), Double Spin Box(雙微調框), Time Edit(時間編輯框), Date Edit(日期編輯框), Date/Time Edit(日期/時間編輯框), Dial(撥號盤) |
Sliders(滑塊) | Horizontal Bar(水平條), Vertical Bar(垂直條), Horizontal Slider(水平滑塊), Vertical Slider(垂直滑塊) |
Key Sequence Edit(鍵序列編輯) | |
Display Widgets(顯示控件) | Label(標簽), Text Browser(文本瀏覽器), Graphics View(圖形視圖), Calendar Widget(日歷控件), LCD Number(LCD數字顯示), Progress Bar(進度條), Horizontal Line(水平線), Vertical Line(垂直線) |
這個表格將 Qt 控件按照其功能和用途進行了分類,并列出每個分類下的子控件類型!
Qt 近幾年還提供了 Qt Design Studio --- 對標現代化的界面體系 --- 制作出來的頁面的美觀程度是業界最領先的一檔!!!但是目前收費!!!哭了~~~
Qt 中的各種控件都繼承自 QWidget 這個類!--- Qt 控件體系中,通用的一部分!
但是:學習 Qt 時,熟悉并掌握內置常用控件是重要任務,這些控件對快速開發符合需求的界面至關重要。
控件體系的發展經歷了三個階段:
-
第一階段:完全沒有控件,需通過繪圖 API 手動繪制按鈕、輸入框等內容,代碼繁瑣,如文曲星的 Lava 平臺開發。
-
第二階段:只包含粗略的控件,如按鈕、輸入框、單選框、復選框等最常用控件,例如 html 的原生控件。
-
第三階段:更完整的控件體系,基本覆蓋 GUI 開發中的大部分場景,如早期的 MFC、VB、C++ Builder、Qt、Delphi,后來的 Android SDK、Java FX、前端的各種 UI 庫等。前端中的 Element-ui 的控件在豐富程度和顏值上比 Qt 自帶的控件更勝一籌。
QWidget 核心屬性
在 Qt 中,使用 QWidget 類表示“控件”,具體控件類如按鈕、視圖、輸入框、滾動條等都繼承自 QWidget。QWidget 包含了 Qt 整個控件體系中通用的部分。
在 Qt Designer 中,拖動控件后,選中該控件,可在右下方看到 QWidget 中的屬性,這些屬性既可通過 Qt Designer 直接修改,也可通過代碼方式修改,具體含義在 Qt Assistant 中有詳細介紹,搜索 QWidget 即可找到文檔說明,或在 Qt Creator 代碼中選中 QWidget 按 F1 查看。
核心屬性概覽:
屬性名 | 描述 |
---|---|
enabled | 設置控件是否可用,true 表示可用,false 表示禁用。 |
geometry | 位置和尺寸,包含 x、y、width、height 四個部分,坐標以父元素為參考。 |
windowTitle | 設置 widget 標題。 |
windowIcon | 設置 widget 圖標。 |
windowOpacity | 設置 widget 透明度。 |
cursor | 鼠標懸停時顯示的圖標形狀,如普通箭頭、沙漏、十字等,在 Qt Designer 界面中有可選項。 |
font | 字體相關屬性,涉及字體家族、字體大小、粗體、斜體、下劃線等樣式。 |
toolTip | 鼠標懸停在 widget 上時在狀態欄中顯示的提示信息。 |
toolTipDuration | toolTip 顯示的持續時間。 |
statusTip | Widget 狀態發生改變時顯示的提示信息(如按鈕被按下等)。 |
whatsThis | 鼠標懸停并按下 alt+F1 時顯示的幫助信息,顯示在一個彈出的窗口中。 |
styleSheet | 允許使用 CSS 來設置 widget 中的樣式,Qt 支持的樣式豐富,對前端開發人員友好。 |
focusPolicy | 該 widget 如何獲取焦點,有以下幾種方式: ? |
contextMenuPolicy | 上下文菜單的顯示策略,有以下幾種: ? |
locale | 設置語言和國家地區。 |
acceptDrops | 該部件是否接受拖放操作。如果設置為 true,該部件可以接收來自其他部件的拖放操作,并會接收到相應的拖放事件;如果設置為 false,則不會接收任何拖放操作。 |
minimumSize | 控件的最小尺寸,包含最小寬度和最小高度。 |
maximumSize | 控件的最大尺寸,包含最大寬度和最大高度。 |
sizePolicy | 尺寸策略,設置控件在布局管理器中的縮放方式。 |
windowModality | 指定窗口是否具有“模態”行為。 |
sizeIncrement | 拖動窗口大小時的增量單位。 |
baseSize | 窗口的基礎大小,用來搭配 sizeIncrement 調整組件尺寸時計算組件應該調整到的合適值。 |
palette | 調色板,可以設置 widget 的顏色風格。 |
mouseTracking | 是否要跟蹤鼠標移動事件。如果設為 true,表示需要跟蹤,鼠標劃過時該 widget 能持續收到鼠標移動事件;如果設為 false,表示不需要跟蹤,鼠標劃過時 widget 不會收到鼠標移動事件,只能收到鼠標按下或者釋放的事件。 |
tabletTracking | 是否跟蹤觸摸屏的移動事件,類似于 mouseTracking,是 Qt 5.9 中引入的新屬性。 |
layoutDirection | 布局方向,有以下幾種: ? |
autoFillBackground | 是否自動填充背景顏色。 |
windowFilePath | 能夠把 widget 和一個本地文件路徑關聯起來,但作用不大。 |
accessibleName | 設置 widget 的可訪問名稱,這個名稱可以被輔助技術(像屏幕閱讀器)獲取到,用于實現無障礙程序的場景中,比如給盲人寫的程序。其實盲人也可以使用電腦和手機,甚至能成為程序員,可參考鏈接我采訪了幾位盲人程序員,看看他們是怎么寫代碼的【差評君】_嗶哩嗶哩_bilibili。 |
accessibleDescription | 設置 widget 的詳細描述,作用同 accessibleName。 |
inputMethodHints | 針對輸入框有效,用來提示用戶當前能輸入的合法數據的格式,比如只能輸入數字、只能輸入日期等。 |
接下來會介紹一些比較重要比較常用的屬性,并附有代碼示例!
enabled:
方法 --- API | 描述 --- 功能 |
---|---|
isEnabled() | 獲取到控件的可用狀態。 |
setEnabled(bool) | 設置控件是否可用,true ?表示可用,false ?表示禁用。 |
所謂“禁用”指的是該控件不能接收任何用戶的輸入事件,并且外觀上往往是灰色的。如果一個 widget 被禁用,則該 widget 的子元素也被禁用。
代碼示例:使用代碼創建一個禁用狀態的按鈕 --- widget.cpp
Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{ui->setupUi(this);QPushButton* btn = new QPushButton(this);btn->setText("這是個被禁用的按鈕");btn->setEnabled(false);
}
運行程序,可以看到按鈕處于灰色狀態,無法被點擊。
代碼示例:通過按鈕2 切換按鈕1 的禁用狀態.
使用 Qt Designer 拖兩個按鈕到 Widget 中,兩個按鈕的 objectName 分別為 pushButton 和 pushButton_2
📚 QObject 的 objectName 屬性介紹: QObject 是 QWidget 的父類.。里面最主要的屬性就是 objectName 。
在一個 Qt 程序中,objectName 相當于對象的身份標識,彼此之間不能重復.。
在使用 Qt Designer 時, 尤其是界面上存在多個 widget 的時候, 可以通過 objectName 獲取到指定的 widget 對象。Qt Designer 生成的 ui 文件, 本身是 xml 格式的。qmake 會把這個 xml 文件轉換成 C++ 的 .h 文件(這個文件生成在 build 目錄中),構成一個 ui_widget 類。
每個 widget 的 objectName 最終就會成為 ui_widget 類的屬性名字。最終這個類的實例,就是 Ui::Widget *ui ,因此就可以通過形如 ui->pushButton 或者 ui->pushButton_2 這樣的代碼獲取到界面上的 widget 對象了。
class Ui_Widget
{
public:QPushButton *pushButton;QPushButton *pushButton_2;
}
生成兩個按鈕的 slot 函數;
- 使用 isEnabled 獲取當前按鈕的可用狀態;
- 使用 setEnabled 修改按鈕的可用狀態;
此處是直接針對原來的可用狀態進行取反后設置。
void Widget::on_pushButton_clicked()
{qDebug() << "按下按鈕";
}
void Widget::on_pushButton_2_clicked()
{bool flag = this->ui->pushButton->isEnabled();this->ui->pushButton->setEnabled(!flag);
}
運行程序,可以看到,初始情況下,上面的按鈕是可用狀態,點擊下方按鈕,即可使上方按鈕被禁用;?
再次點擊下方按鈕,上方按鈕就會解除禁用。?(禁用狀態的按鈕為 灰色, 且不可點擊)?
🥛 在 Qt Designer 中創建按鈕的時候,可以設置按鈕的初始狀態是 "可用" 還是 "禁用" 。如果把 enabled 這一列的對鉤去掉,則按鈕的初始狀態就是 "禁用" 狀態。
下一篇繼續!!!請持續關注😋😋😋😋😋
下一篇繼續!!!請持續關注😋😋😋😋😋
下一篇繼續!!!請持續關注😋😋😋😋😋