文章目錄
- 前言
- 控件概述
- QWidget
- enable屬性
- geometry屬性
- windowTitle屬性
- windowlcon屬性
- 小結
前言
本文將會向你介紹常用的Qwidget屬性
控件概述
Widget 是 Qt 中的核心概念. 英文原義是 “?部件”, 我們此處把它翻譯為 “控件” .
控件是構成?個圖形化界面的基本要素.
QWidget
在 Qt 中, 使? QWidget 類表? “控件”. 像按鈕, 視圖, 輸?框, 滾動條等具體的控件類, 都是繼承?QWidget. 可以說, QWidget 中就包含了 Qt 整個控件體系中通用的部分
下列表格列出了 QWidget 中的屬性及其作用.
屬性 | 作? |
---|---|
enabled | 設置控件是否可使?. true 表示可用, false 表示禁用 |
geometry | 位置和尺寸. |
windowTitle | 設置 widget 標題 |
windowIcon | 設置 widget 圖標 |
windowOpacity | 設置 widget 透明度 |
cursor | ?標懸停時顯?的圖標形狀,是普通箭頭, 還是沙漏, 還是?字等形狀.在 Qt Designer 界?中可以清楚看到可選項. |
font | 字體相關屬性,涉及到字體家族, 字體大小, 粗體, 斜體, 下劃線等等樣式 |
toolTip | ?標懸停在 widget 上會在狀態欄中顯?的提?信息 |
toolTipDuring | toolTip 顯?的持續時間 |
statusTip | Widget 狀態發?改變時顯?的提?信息(比如按鈕被按下等 |
whatsThis | ?標懸停并按下 alt+F1 時, 顯示的幫助信息(顯示在?個彈出的窗?中 |
styleSheet | 允許使? CSS 來設置 widget 中的樣式. |
contextMenuPolicy | 上下文菜單的顯示策略。 |
locale | 設置語?和國家地區. |
acceptDrops | 該部件是否接受拖放操作。如果設置為true,那么該部件就可以接收來?其他部件的拖放操作。當?個部件被拖放到該部件上時,該部件會接收到相應的拖放事件(如dropEvent)。如果設置為false,那么該部件將不會接收任何拖放操作。 |
minimumSize | 控件的最小尺寸. 包含最?寬度和最小高度 |
maximumSize | 控件的最大尺寸 包含最?寬度和最大高度. |
sizePolicy | 尺寸策略. 設置控件在布局管理器中的縮放方式 |
windowModality | 指定窗?是否具有 “模態” 行為 |
sizeIncrementt | 拖動窗口大小時的增量單位 |
baseSize | 窗?的基礎大小, 用來搭配 sizeIncrement 調整組件尺寸是計算組件應該調整到的合適的值 |
palette | 調?板. 可以設置 widget 的顏色風格 |
mouseTracking | 是否要跟蹤鼠標移動事件.如果設為 true, 表示需要跟蹤, 則?標劃過的時候該 widget 就能持續收到?標移動事件.如果設為 false, 表示不需要跟蹤, 則?標劃過的時候 widget 不會收到鼠標移動事件, 只能收到?標按下或者釋放的事件. |
tabletTracking | 是否跟蹤觸摸屏的移動事件. |
layoutDirection | 布局?向.Qt::LeftToRight:?本從左到右排列,也是默認值。 Qt::RightToLeft:文本從右到左排列。Qt::GlobalAtomics:部件的布局?向由全局原?性決定. |
autoFillBackground | 是否自動填充背景顏色. |
accessibleName | 設置 widget 的可訪問名稱. 這個名稱可以被輔助技術 (像屏幕閱讀器) 獲取到. |
windowFilePath | 能夠把 widget 和?個本地?件路徑關聯起來. PS: 其實作?不大 |
accessibleDescription | 設置 widget 的詳細描述. 作?同 accessibleName. |
inputMethodHints | 針對輸?框有效, ?來提示用戶當前能輸?的合法數據的格式. 比如只能輸?數字, 只能輸入日期等. |
下面詳細介紹一些常用的屬性
enable屬性
API | 說明 |
---|---|
isEnabled() | 獲取到控件的可?狀態 |
setEnabled | 設置控件是否可使?. true 表?可?, false 表示禁用 |
說明:
所謂 “禁用” 指的是該控件不能接收任何用戶的輸?事件, 并且外觀上往往是灰色的.
如果?個 widget 被禁?, 則該 widget 的子元素也被禁用
放置兩個按鈕,然后編寫相應的槽函數
Qwidget.cpp
#include "widget.h"
#include "ui_widget.h"
#include <QDebug>Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{ui->setupUi(this);
}Widget::~Widget()
{delete ui;
}void Widget::on_pushButton_clicked()
{qDebug() << "執行了槽函數";
}void Widget::on_pushButton_enable_clicked()
{//點擊下?按鈕, 即可使上?按鈕被禁?; 再次點擊下?按鈕, 上?按鈕就會解除禁?. (禁?狀態的按鈕為
灰?, 且不可點擊)bool enable = ui->pushButton->isEnabled();if(enable){ui->pushButton->setEnabled(false);} else{ui->pushButton->setEnabled(true);}
}
當點擊change button state按鈕會切換PushButton的狀態
geometry屬性
API | 說明 |
---|---|
geometry() | 獲取到控件的位置和尺?. 返回結果是?個 QRect, 包含了 x, y, width, height. 其中 x, y 是左上?的坐標 |
setGeometry(QRect),setGeometry(int x, int y, int width, int height) | 設置控件的位置和尺?. 可以直接設置?個 QRect, 也可以分四個屬性單獨設置 |
①在界面中拖拽5個按鈕,五個按鈕的 objectName 分別為 pushButton_target , pushButton_up , pushButton_down , pushButton_left , pushButton_right
五個按鈕的初始位置和大小都隨意.
②在Widget.cpp中編寫四個按鈕的槽函數
#include "widget.h"
#include "ui_widget.h"
#include <QDebug>Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{ui->setupUi(this);
}Widget::~Widget()
{delete ui;
}void Widget::on_pushButton_up_clicked()
{//獲取到target本身的geometryQRect rect = ui->pushButton_target->geometry();qDebug() << rect;rect.setY(rect.y() - 5);ui->pushButton_target->setGeometry(rect);//ui->pushButton_target->setGeometry(rect.x(), rect.y() - 5, rect.width(), rect.height());
}void Widget::on_pushButton_down_clicked()
{QRect rect = ui->pushButton_target->geometry();qDebug() << rect;rect.setY(rect.y() + 5);ui->pushButton_target->setGeometry(rect);//ui->pushButton_target->setGeometry(rect.x(), rect.y() + 5, rect.width(), rect.height());
}void Widget::on_pushButton_left_clicked()
{QRect rect = ui->pushButton_target->geometry();qDebug() << rect;rect.setX(rect.x() - 5);ui->pushButton_target->setGeometry(rect);//ui->pushButton_target->setGeometry(rect.x() - 5, rect.y(), rect.width(), rect.height());
}void Widget::on_pushButton_right_clicked()
{QRect rect = ui->pushButton_target->geometry();qDebug() << rect;rect.setX(rect.x() + 5);ui->pushButton_target->setGeometry(rect);//ui->pushButton_target->setGeometry(rect.x() + 5, rect.y(), rect.width(), rect.height());
}
值得注意的是,如果我們采用以上的代碼想要實現使用上下左右四個按鈕來控制target按鈕的移動,這樣是不行的,在代碼中 rect.setX(rect.x() + 5);這樣僅僅只會修改左上角的坐標位置,對應整個按鈕的大小尺寸也會發生改變
我們需要使用注釋中的代碼,來保證窗口的高度與寬度不變
如:
ui->pushButton_target->setGeometry(rect.x() + 5, rect.y(), rect.width(), rect.height())
windowTitle屬性
API | 說明 |
---|---|
windowTitle() | 獲取到控件的窗?標題 |
setWindowTitle(constQString& title) | 設置控件的窗?標題. |
Widget.cpp
Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget){ui->setupUi(this);// 設置窗?標題this->setWindowTitle("這是標題");}
windowlcon屬性
API | 說明 |
---|---|
windowIcon() | 獲取到控件的窗?圖標. 返回 QIcon 對象 |
setWindowIcon(constQIcon& icon) | 設置控件的窗?圖標. |
說明:只對頂層widget有效
設置控件的窗口圖標,那么我們就需要引入一個圖片資源,我們可以在創建圖標對象的時候指明絕對路徑
如:
QIcon icon("d:/fulilian.jpg");
注意: Windows 下路徑的分隔符可以使? / 也可以使? \ . 但是如果在 字符串 中使? \ , 需要寫作轉義字符的形式 \ . 因此我們還是更推薦使? / .
但使用絕對路徑可能會產生一個問題,我們無法保證程序發布后,用戶的電腦上也有同樣的路徑
如果使用相對路徑,需要明確當前工作目錄,因為相對路徑以. (表?當前路徑) 或者 以 … (表?當前路徑上級路徑) 開頭的路徑
對于QT程序來說,當前工作目錄可能會變化的,比如通過Qt Creator運行的程序,當前工作目錄是項目的構建目錄,也就是exe所在目錄。所謂構建目錄就是和Qt項目并列且專門用來存放生成的臨時文件和最終exe的目錄
創建一個新的文件來驗證當前工作目錄是項目的構建目錄,在界面上拖拽一個大的label來確保能把路徑顯示完整
獲取當前目錄
#include "widget.h"
#include "ui_widget.h"
#include <QDir>Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{ui->setupUi(this);// 獲取到當前?作?錄QString currentDir = QDir::currentPath();// 設置?作?錄到 label 中.ui->label->setText(currentDir);
}Widget::~Widget()
{delete ui;
}
觀察到當前工作目錄的確是項目的構建目錄
如果我們把圖片資源放入到構建目錄中,如果不小心刪除后就丟失了(構建目錄是隨時可以刪除的,當點擊菜單欄中“構建”->“清理項目”就會把這個目錄中的內容清空),我們還是希望能夠把圖片和源代碼放到?起, 并且使我們的程序無論拷貝到任何位置中都能正確使用圖片
Qt 使? qrc 機制幫我們自動完成了上述工作, 更方便的來管理項目依賴的靜態資源
qrc ?件是?種XML格式的資源配置?件, 它?XML記錄硬盤上的?件和對應的隨意指定的資
源名稱. 應?程序通過資源名稱來訪問這些資源.
在Qt開發中, 可以通過將資源?件添加到項?中來方便地訪問和管理這些資源. 這些資源文件
可以位于qrc文件所在目錄的同級或其子?錄下.
在構建程序的過程中, Qt 會把資源?件的?進制數據轉成 cpp 代碼, 編譯到 exe 中. 從?使依
賴的資源變得 “路徑無關”.
這種資源管理機制并非 Qt 獨有, 很多開發框架都有類似的機制. 例如 Android 的 Resources
和 AssetManager 也是類似的效果.
創建一個新項目后,再創建?個 Qt Resource File (qrc ?件)
文件名稱不要帶中文
點擊完成即可
此處前綴我們設置成 / 即可。前綴可以理解成“目錄”,這個前綴決定了后續我們如何在代碼中訪問資源,然后再點擊add Files 添加資源文件. 此處我們需要添加的是 fililian.jpg
在本地找到對應的圖片后,添加到與fulilian.qrc的同一個目錄中
這樣就添加好了
在資源編輯器中可以看到添加好的文件
編輯Widget.cpp文件
#include "widget.h"
#include "ui_widget.h"#include <QIcon>
#include <QDir>
#include <QDebug>Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{ui->setupUi(this);//設置圖標QIcon icon(":/fulilian.png");this->setWindowIcon(icon);
}Widget::~Widget()
{delete ui;
}
注意上述路徑的訪問規則.
- 使? : 作為開頭, 表?從 qrc 中讀取資源.
- / 是上面配置的前綴
- rose.jpg 是資源的名稱
需要確保代碼中編寫的路徑和添加到 qrc 中資源的路徑匹配. 否則資源無法被訪問
這樣就搞定了
上述 qrc 這?套資源管理方案, 優點和缺點都很明顯.
優點: 確保了圖片, 字體, 聲音等資源能夠真正做到 “目錄無關”, 無論如何都不會出現資源丟失
的情況.
缺點: 不適合管理體積?的資源. 如果資源比較大 (比如是幾個 MB 的文件), 或者資源特別多,
生成的最終的 exe 體積就會比較大, 程序運行消耗的內存也會增大, 程序編譯的時間也會顯著
增加
小結
本文就到這里啦,如果本文存在疏漏或錯誤的地方,還請您能夠指出,下篇文章將會繼續談論Qwidget的常見屬性