翻譯|使用教程|編輯:龔雪|2024-06-17 11:39:01.217|閱讀 141 次
概述:本文將為大家介紹如何使用Qt Widget小部件如何實(shí)現(xiàn)一個(gè)滑動(dòng)條示例,歡迎下載最新版組件體驗(yàn)~
# 界面/圖表報(bào)表/文檔/IDE等千款熱門軟控件火熱銷售中 >>
相關(guān)鏈接:
Qt 是目前最先進(jìn)、最完整的跨平臺(tái)C++開發(fā)工具。它不僅完全實(shí)現(xiàn)了一次編寫,所有平臺(tái)無差別運(yùn)行,更提供了幾乎所有開發(fā)過程中需要用到的工具。如今,Qt已被運(yùn)用于超過70個(gè)行業(yè)、數(shù)千家企業(yè),支持?jǐn)?shù)百萬設(shè)備及應(yīng)用。
滑動(dòng)條示例展示了如何使用Qt中可用的不同類型的滑動(dòng)條:, 和 。
Qt提供了三種類似滑動(dòng)條的小部件:QSlider、QScrollBar和QDial,它們都繼承了QAbstractSlider的大部分功能,并且理論上可以在應(yīng)用程序中相互替換,因?yàn)椴町愔簧婕八鼈兊耐庥^和樣式。這個(gè)例子展示了它們是什么樣子的,它們是如何工作的,以及如何通過它們的屬性來操縱它們的操作和外觀。
Qt技術(shù)交流群:166830288 歡迎一起進(jìn)群討論
本示例還演示了如何使用信號(hào)和槽來同步兩個(gè)或多個(gè)小部件的操作,以及如何覆蓋resizeEvent()來實(shí)現(xiàn)響應(yīng)式布局。
Sliders(滑動(dòng)條)示例包含兩個(gè)類:
首先我們將回顧 Window 類,然后再看看SlidersGroup類。
class Window : public QWidget { Q_OBJECT public: Window(QWidget *parent = nullptr); private: void createControls(const QString &title); void resizeEvent(QResizeEvent *e); SlidersGroup *slidersGroup; QGroupBox *controlsGroup; QLabel *minimumLabel; QLabel *maximumLabel; QLabel *valueLabel; QCheckBox *invertedAppearance; QCheckBox *invertedKeyBindings; QSpinBox *minimumSpinBox; QSpinBox *maximumSpinBox; QSpinBox *valueSpinBox; QBoxLayout *layout; };
Window類繼承自,它顯示滑塊小部件,并允許用戶設(shè)置它們的最小值、最大值和當(dāng)前值,并自定義它們的外觀、鍵綁定和方向。我們使用一個(gè)私有的createcontrol()函數(shù)來創(chuàng)建提供這些控制機(jī)制的小部件,并將它們連接到滑塊小部件。
Window::Window(QWidget *parent) : QWidget(parent) { slidersGroup = new SlidersGroup(tr("Sliders")); createControls(tr("Controls"));
在構(gòu)造函數(shù)中,我們首先創(chuàng)建顯示滑塊小部件的SlidersGroup小部件。使用createcontrol()創(chuàng)建控件小部件,并將它們連接到滑塊。
layout = new QBoxLayout(QBoxLayout::LeftToRight); layout->addWidget(controlsGroup); layout->addWidget(slidersGroup); setLayout(layout); minimumSpinBox->setValue(0); maximumSpinBox->setValue(20); valueSpinBox->setValue(5); setWindowTitle(tr("Sliders")); }
在初始化最小值、最大值和當(dāng)前值之前,我們將控制小部件組和滑塊放在水平布局中。當(dāng)前值的初始化將通過我們?cè)趘alueSpinBox和SlidersGroup小部件之間建立的連接傳播到滑塊小部件,最小值和最大值通過用createcontrol()創(chuàng)建的連接傳播。
void Window::createControls(const QString &title) { controlsGroup = new QGroupBox(title); minimumLabel = new QLabel(tr("Minimum value:")); maximumLabel = new QLabel(tr("Maximum value:")); valueLabel = new QLabel(tr("Current value:")); invertedAppearance = new QCheckBox(tr("Inverted appearance")); invertedKeyBindings = new QCheckBox(tr("Inverted key bindings"));
在私有的createcontrol()函數(shù)中,我們讓 (controlsGroup)顯示控制小部件,組合框可以提供框架、標(biāo)題和鍵盤快捷方式,并在其內(nèi)部顯示各種其他小部件,控制小部件組由兩個(gè)復(fù)選框和三個(gè)帶標(biāo)簽的旋轉(zhuǎn)框組成。
在創(chuàng)建標(biāo)簽之后,我們創(chuàng)建兩個(gè)復(fù)選框,復(fù)選框通常用于表示應(yīng)用程序中可以啟用或禁用的特性。當(dāng)invertedAppearance被啟用時(shí),滑塊值被反轉(zhuǎn),下表顯示了不同的類似滑塊小部件的外觀:
反轉(zhuǎn)垂直的外觀是很常見的,例如控制音量的垂直滑塊通常會(huì)從下到上(非倒置的外觀),而控制屏幕上對(duì)象位置的垂直滑塊可能會(huì)從上到下,因?yàn)槠聊蛔鴺?biāo)是從上到下的。
當(dāng)invertedKeyBindings選項(xiàng)被啟用時(shí)(對(duì)應(yīng)于 屬性),滑塊的滾輪和鍵事件被反轉(zhuǎn)。正常的鍵綁定意味著向上滾動(dòng)鼠標(biāo)滾輪或使用像page up這樣的鍵會(huì)將滑塊的當(dāng)前值增加到最大值,反過來,相同的滾輪和鍵事件將把值移動(dòng)到滑塊的最小值。如果滑塊的外觀是顛倒的,這可能很有用:一些用戶可能希望鍵在值上仍然以相同的方式工作,而另一些用戶可能希望PageUp在屏幕上表示“向上”。
注意,對(duì)于水平和垂直滾動(dòng)條,默認(rèn)情況下鍵綁定是反向的:PageDown增加當(dāng)前值,而PageUp減少當(dāng)前值。
minimumSpinBox = new QSpinBox; minimumSpinBox->setRange(-100, 100); minimumSpinBox->setSingleStep(1); maximumSpinBox = new QSpinBox; maximumSpinBox->setRange(-100, 100); maximumSpinBox->setSingleStep(1); valueSpinBox = new QSpinBox; valueSpinBox->setRange(-100, 100); valueSpinBox->setSingleStep(1);
然后我們創(chuàng)建旋轉(zhuǎn)箱, 允許用戶通過單擊向上和向下按鈕或按鍵盤上的向上和向下鍵來選擇一個(gè)值,以修改當(dāng)前顯示的值,用戶也可以手動(dòng)輸入該值。旋轉(zhuǎn)框控制、和小部件的最小值、最大值和當(dāng)前值。
connect(slidersGroup, &SlidersGroup::valueChanged, valueSpinBox, &QSpinBox::setValue); connect(valueSpinBox, &QSpinBox::valueChanged, slidersGroup, &SlidersGroup::setValue); connect(minimumSpinBox, &QSpinBox::valueChanged, slidersGroup, &SlidersGroup::setMinimum); connect(maximumSpinBox, &QSpinBox::valueChanged, slidersGroup, &SlidersGroup::setMaximum); connect(invertedAppearance, &QCheckBox::toggled, slidersGroup, &SlidersGroup::invertAppearance); connect(invertedKeyBindings, &QCheckBox::toggled, slidersGroup, &SlidersGroup::invertKeyBindings); QGridLayout *controlsLayout = new QGridLayout; controlsLayout->addWidget(minimumLabel, 0, 0); controlsLayout->addWidget(maximumLabel, 1, 0); controlsLayout->addWidget(valueLabel, 2, 0); controlsLayout->addWidget(minimumSpinBox, 0, 1); controlsLayout->addWidget(maximumSpinBox, 1, 1); controlsLayout->addWidget(valueSpinBox, 2, 1); controlsLayout->addWidget(invertedAppearance, 0, 2); controlsLayout->addWidget(invertedKeyBindings, 1, 2); controlsGroup->setLayout(controlsLayout); }
然后我們將slidersGroup和valueSpinBox相互連接,這樣當(dāng)其中一個(gè)的當(dāng)前值發(fā)生變化時(shí),滑塊小部件和控制小部件的操作將同步。valueChanged()信號(hào)以新值作為參數(shù)發(fā)出,setValue()槽將小部件的當(dāng)前值設(shè)置為新值,如果新值與舊值不同,則發(fā)出valueChanged()。
我們通過控制部件和滑塊部件的信號(hào)和槽來同步它們的操作,將每個(gè)控件小部件連接到滑塊小部件的水平和垂直組,同時(shí)將orientationCombo連接到,以便顯示正確的“頁面”。最后,我們?cè)赾ontrolsGroup組框中的中布局控制小部件。
void Window::resizeEvent(QResizeEvent *) { if (width() == 0 || height() == 0) return; const double aspectRatio = double(width()) / double(height()); if (aspectRatio < 1.0) { layout->setDirection(QBoxLayout::TopToBottom); slidersGroup->setOrientation(Qt::Horizontal); } else if (aspectRatio > 1.0) { layout->setDirection(QBoxLayout::LeftToRight); slidersGroup->setOrientation(Qt::Vertical); } }
最后我們從QWidget重寫resizeEvent(),避免除以零,否則計(jì)算小部件的寬高比。如果窗口具有縱向格式,那么我們?cè)O(shè)置布局以垂直地組織控制小部件和滑塊組,并將滑塊設(shè)置為水平方向。如果窗口是橫向格式,那么我們改變布局,讓滑塊和控制并排顯示,并給滑塊一個(gè)垂直方向。
篇幅有限未完待續(xù),更多內(nèi)容敬請(qǐng)期待.......
本站文章除注明轉(zhuǎn)載外,均為本站原創(chuàng)或翻譯。歡迎任何形式的轉(zhuǎn)載,但請(qǐng)務(wù)必注明出處、不得修改原文相關(guān)鏈接,如果存在內(nèi)容上的異議請(qǐng)郵件反饋至chenjj@fc6vip.cn
文章轉(zhuǎn)載自:慧都網(wǎng)