文章目錄
- 1 QDial
- 1.1 核心屬性
- 1.2 核心信號
- 1.3 代碼示例 - 創建 QDial 控制 Widget 透明度
- 2 QSlider
- 2.1 核心屬性
- 2.2 核心信號
- 2.3 示例代碼 - 創建 QSilder 控制 Widget 長寬
- 2.3.1 為程序設置快捷鍵 - 通過快捷鍵控制 Slider 設置長寬
1 QDial
QDial控件是Qt中提供的一種旋鈕控件, 通過旋鈕來控制某些數值的增減;
通常通過鼠標來控制旋鈕的旋轉以此控制數值的變化;
1.1 核心屬性
|
屬性
|
説明
|
|
|
持有的數值
|
|
|
最小值
|
|
|
最大值
|
|
|
按下方向鍵的時候改變的步長
|
|
|
按下 |
|
|
界面上的旋鈕初始位置
|
|
|
外觀是否跟蹤數值變化
默認為 |
|
|
是否允許循環調整
即數值如果超過最大值, 是否允許回到最小值
(調整過程能否循環)
|
|
|
是否顯示刻度線
|
|
|
刻度線之間的相對位置
數字越大, 刻度線越稀疏
|
1.2 核心信號
|
信號
|
説明
|
|
|
數值改變時觸發
|
|
|
範圍改變時觸發(通常用户無法通過手動操作來修改 因此當代碼觸發範圍變化(如 |
1.3 代碼示例 - 創建 QDial 控制 Widget 透明度
創建一個QDial, 通過QDial來實現對Widget的控制, 並將當前值顯示在Label中;
- 所需控件
QDialLabel
- 初始化控件
在實際設計之前需要對控件進行初始化, 如QLabel的初始化顯示與QDial的最小值, 最大值, 刻度線等內容;
Widget::Widget(QWidget *parent)
: QWidget(parent)
, ui(new Ui::Widget)
{
ui->setupUi(this);
ui->dial->setMaximum(50);
ui->dial->setMinimum(0);
ui->dial->setNotchesVisible(true);
ui->label->setText("當前透明度為: "+QString::number(ui->dial->value()));
}
- 設計槽函數
QLabel為用於顯示的控件, 因此不對其信號進行處理, 重點處理QDial控件的ValueChanged(int)信號;
對應的槽重點修改windowOpacity透明度的內容, 其中ValueChanged(int)中所給的int為當前控件的所在位置的值;
void Widget::on_dial_valueChanged(int value)
{
this->setWindowOpacity(((double)100-value)/100);
ui->label->setText("當前透明度為: "+QString::number(ui->dial->value()));
}
我們重點設置的是透明度, 而不是不透明度, 為了避免透明度過高而找不到窗口, 這裏我們選擇使用50為最終值;
- 運行結果
2 QSlider
QSlider控件是Qt提供的一種滑動條控件;
旨在能夠設計一個滑動條來改變某些控件的參數或是其他控制;
可以看到, 實際上在側邊欄中QSlider存在兩種, 分別為橫向與縱向;
實際上其可以通過對應的屬性來修改橫向或是縱向;
其中Horizontal為橫向, Vertical為縱向;
其使用方法與QDial類似;
2.1 核心屬性
|
屬性
|
説明
|
|
|
持有的數值
|
|
|
最小的數值
|
|
|
最大的數值
|
|
|
按下方向鍵時改變的步長
|
|
|
按下 |
|
|
滑動條顯示的初始位置
|
|
|
外觀是否會跟蹤數值變化
默認值為 |
|
|
滑動條的方向是水平還是垂直
|
|
|
是否要反轉滾動條的方向
|
|
|
刻度的位置
|
|
|
刻度的密集程度
|
2.2 核心信號
|
信號
|
説明
|
|
|
數值改變時觸發
|
|
|
範圍變化時觸發
|
該控件的核心信號與QDial控件類似;
2.3 示例代碼 - 創建 QSilder 控制 Widget 長寬
創建一個程序, 通過橫向, 縱向QSilder分別控制Widget的長寬
- 所需控件
兩個
QSilder控件, 分別為橫向與縱向;
- 初始化控件
對所需控件進行初始化, 本質上是對兩個Slider的最大值/最小值以及當前值進行初始化;
Widget::Widget(QWidget *parent)
: QWidget(parent)
, ui(new Ui::Widget)
{
ui->setupUi(this);
ui->horizontalSlider->setMaximum(1500);
ui->horizontalSlider->setMinimum(500);
ui->horizontalSlider->setValue(this->geometry().width());
ui->horizontalSlider->setSingleStep(10);
ui->verticalSlider->setInvertedAppearance(true); // 反轉方向
ui->verticalSlider->setMaximum(800);
ui->verticalSlider->setMinimum(500);
ui->verticalSlider->setValue(this->geometry().height());
ui->verticalSlider->setSingleStep(10);
}
1. 設置槽函數
對兩個Silder的valueChanged()信號進行處理;
通過信號所給的值來設置Widget的geometry的寬與高;
void Widget::on_horizontalSlider_valueChanged(int value)
{
this->setGeometry(geometry().x(), geometry().y(), value, geometry().height());
}
void Widget::on_verticalSlider_valueChanged(int value)
{
this->setGeometry(geometry().x(), geometry().y(), geometry().width(), value);
}
- 運行結果
2.3.1 為程序設置快捷鍵 - 通過快捷鍵控制 Slider 設置長寬
實際上針對Slider控件而言, 其可以通過方向鍵(up/down/left/right)來控制數值的增長, 但有兩個問題:
- 在通過方向鍵來控制時焦點必須在該控件上
up與right永遠為增,down與left永遠為降
而在Qt中可以通過ShortCut類設置快捷鍵來綁定對應的控件;
此處我們將快捷鍵設置為h/j/k/l, 其中k為縱向Slider的縮小, j為縱向Slider的增大, h則為橫向的縮小, l為橫向的增大;
此次每次步長設置為15, 且再添加一個QLabel來顯示對應的按鍵;
1. 設置快捷鍵對象並綁定快捷鍵
快捷鍵對象通常在使用QShortcut類來定製;
QShortcut *shortcutH = new QShortcut(this);
QShortcut *shortcutJ = new QShortcut(this);
QShortcut *shortcutK = new QShortcut(this);
QShortcut *shortcutL = new QShortcut(this);
shortcutH->setKey(QKeySequence("h"));
shortcutJ->setKey(QKeySequence("j"));
shortcutK->setKey(QKeySequence("k"));
shortcutL->setKey(QKeySequence("l"));
通過setKey方法並傳入QKeySequence對象來綁定對應的快捷鍵;
1. 設置槽函數
當對應快捷鍵被按下時, 將會發出一個QShortcut::activated()信號;
需要對應的槽函數來處理對應的信號, 而槽內則是直接對Slider控件的value進行修改;
當Slider控件的value發生改變時又會觸發其ValueChanged()信號, 從而修改Widget的大小;
void Widget::horizontalAdd(){
int value = ui->horizontalSlider->value();
ui->horizontalSlider->setValue(value+15);
ui->label->setText("Key - L");
}
void Widget::horizontalSub(){
int value = ui->horizontalSlider->value();
ui->horizontalSlider->setValue(value-15);
ui->label->setText("Key - H");
}
void Widget::verticalAdd(){
int value = ui->verticalSlider->value();
ui->verticalSlider->setValue(value+15);
ui->label->setText("Key - J");
}
void Widget::verticalSub(){
int value = ui->verticalSlider->value();
ui->verticalSlider->setValue(value-15);
ui->label->setText("Key - K");
}
同時需要注意的是, 我們設置了一個QLabel控件來事實打印所按下的快捷鍵;
1. connect綁定信號和槽並初始化QLabel
通過connect來綁定對應的信號和槽, 並初始化QLabel初始化顯示為空;
connect(shortcutH, &QShortcut::activated, this, &Widget::horizontalSub);
connect(shortcutJ, &QShortcut::activated, this, &Widget::verticalAdd);
connect(shortcutK, &QShortcut::activated, this, &Widget::verticalSub);
connect(shortcutL, &QShortcut::activated, this, &Widget::horizontalAdd);
ui->label->setText("");
運行結果