第15.44節、PyQt輸入部件:QAbstractSlider派生類QScrollBar滾動條、QSlider滑動條、QDial刻度盤功能詳解

一、引言

Designer中的輸入部件Horizontal ScrollBar水平滾動條、Vertical ScrollBar垂直滾動條、Horizontal Slider水平滑動條、Vertical Slider垂直滑動條以及Dial刻度盤對應的類都是QAbstractSlider類的派生類。這些部件都可以表示在指定區間範圍內的數值,並通過拖拽滑塊或指針進行移動改變值。

二、QScrollBar滾動條部件

2.1、概述

Horizontal Scroll Bar和Vertical Scroll Bar都是滾動條部件,實際上這2個部件對應同一個類QScrollBar。在需要從QAbstractItemView派生子類提供滾動條時,QScrollBar非常適合,但如果需要在另一個部件上提供滾動視圖,不建議直接使用QScrollBar,而是使用QScrollArea類更方便,因爲它同時提供了一個視口部件和滾動條部件。對於大多數使用滑塊控件獲取給定範圍內的值的其他情況,使用QSlider類更適合。

QScrollBar是從QAbstractSlider類派生的,本身除了構造方法外,並沒有特殊屬性和方法。因此本部分介紹的屬性、非構造方法、信號、槽方法實際上都是QAbstractSlider的。

2.2、滾動條的部件組成

滾動條通常包括四個獨立的控件:1個滑塊、2個滾動箭頭和1個頁面控件。

  • 滑塊提供了快速轉到文檔任何部分的方法,但不支持在大型文檔中進行精確導航
  • 滾動箭頭,滾動箭頭是按鈕,可用於精確導航到文檔中的特定位置。對於連接到文本編輯器的垂直滾動條,這些滾動條通常將當前位置向上或向下移動一行,並將滑塊的位置調整少量。在編輯器和列表框中,“行”可能意味着一行文本;在圖像查看器中,它可能意味着20像素。
  • 頁面控件是拖動滑塊的區域(滾動條的背景)。單擊此處可將滾動條向單擊方向移動一頁。此值通常與滑塊的長度相同。

2.3、滾動條的重要屬性

  • value屬性:每個滾動條都有一個值,該值指示滑塊距滾動條起點的距離,該值通過value()獲得,並通過setValue()設置,value的值在minimum和maximum之間,可以使用setMinimum()和setMaximum()調整最小值和最大值
  • singleStep屬性:表示單步移動的距離,單步移動是指通過單次點擊滾動箭頭或按壓移動光標鍵後滑塊移動的距離
  • pageStep屬性:表示移動一頁的距離,當按壓上下翻頁鍵或在滾動條上下點擊鼠標移動的距離
  • tracking屬性: 當設置爲True時,在拖拽滑塊時就會發出valueChanged()信號,否則只有當終止拖拽釋放鼠標時才發射該信號
  • sliderPosition屬性:滑塊當前位置,如果tracking屬性爲True,則其值與value屬性值相等
  • orientation屬性:表示是水平滾動條還是豎直滾動條
  • invertedAppearance屬性:此屬性控制滑塊是否反轉顯示其值。如果爲False(默認值),則最小值和最大值將顯示在部件的經典位置(如最小值在頂部或左邊)。如果該值爲真,則最小值和最大值將顯示在它們的相反位置
  • invertedControls屬性:此屬性保留滑塊是否反轉響應滾動事件和鍵盤事件。如果此屬性爲False,則滾動鼠標滾輪“向上”並使用諸如“PgUp”之類的鍵將滑塊的值朝最大值增加。否則,按“PgUp”會將值向滑塊的最小值靠近
  • sliderDown屬性:此屬性用於確認滾動條滑塊是否被按住

2.4、重要的方法、信號和槽方法

  • actionTriggered(int action):這個信號是滑塊動作觸發,用於告知是進行了單步增或減移動、按頁增或減移動、移動到最大值、移動到最小值、或移動過程中,發出信號時,滑塊位置已根據操作進行了調整,但該值尚未傳播(valueChanged()信號尚未發出),並且視覺顯示尚未更新。因此,在連接到該信號的插槽中,可以根據動作和滑塊的值,通過自己調用setSliderPosition()來安全地調整任何動作
  • triggerAction(SliderAction action)方法:這個一個方法,觸發一個滑塊移動事件,類似於模擬一個滑塊移動操作,會發射actionTriggered()信號
  • setValue(int):槽方法,調整滾動條的值
  • sliderMoved(int value):此信號在滾動條滑塊被按住且滾動條進行移動時發出,一般是拖拽滾動條時發出
  • sliderPressed():此信號在滾動條被鼠標按住,或者程序執行代碼setSliderDown(True)時發出
  • sliderReleased():此信號在滾動條鬆開鼠標按住,或者程序執行代碼setSliderDown(False)時發出
  • valueChanged(int value):此信號在滾動條值變更時發出

三、QSlider滑動條部件

Horizontal Slider和Vertical Slider是用於通過移動滑塊控制輸入數字的滑動條部件,二者對應同一個類QSlider。滑動條部件提供垂直或水平滑動條。滑動條移動時,滑塊所在的位置會轉換爲對應的數值。

QSlider滑動條部件功能簡介
  • 可以設置滑條是否顯示刻度以及刻度的位置,該功能通過屬性tickPosition來控制
  • 可以設置刻度線之間的距離,該距離通過tickInterval屬性控制

除了以上兩個功能外,QSlider滑動條部件的其他方法、信號全部是父類的,如:

  • 可以調用父類QAbstractSlider的方法setValue()將滑塊直接設置爲某個值
  • 可以調用父類QAbstractSlider的方法triggerAction()模擬單擊的效果
  • 可以調用父類QAbstractSlider的方法setSingleStep(),setPageStep()設置移動的步長

四、QDial刻度盤部件

4.1、概述

Designer中的Dial刻度盤輸入部件提供一個圓形的刻度表,類似速度表,對應類爲QDial類。QDial繼承自QAbstractSlider(關於QAbstractSlider的功能請參考《PyQt(Python+Qt)學習隨筆:QScrollBar以及QAbstractSlider滾動條部件功能詳解》),因此刻度盤與滑動條類似。當wrapping屬性值爲False(默認設置)時,刻度盤和滑動條之間除了外觀外沒有真正的區別。它們共享相同的信號、插槽和成員函數。關於滑動條的功能請參考《PyQt(Python+Qt)學習隨筆:QSlider滑動條部件功能簡介》。

刻度盤的鍵盤操作相當簡單:左鍵/上鍵和右鍵/下鍵按定義的單步移動指針和改變值,PgUp和PgDn按定義的頁面步向上和向下移動指針和調整值,Home鍵和End鍵將移動指針到最小值和最大值。

如果使用鼠標滾輪調整刻度盤,則增量值由 wheelScrollLines乘以singleStep和pageStep的較小值確定。

4.2、QDial撥號盤部件的屬性、方法和信號

QDial刻度盤部件的獨有屬性如下:

  • wrapping屬性 :wrapping用於控制刻度盤上的刻度是否前後連接,如果爲False,則最小值和最大值中間會有一段空白區域進行分隔,使用光標鍵調節值時指針只能在最小值和最大值之間移動,到達最大值或最小值時無法再朝對應方向移動。用鼠標拖拽指針可以越過最大值或最小值進行循環移動,但指針不能在空白區域段停留。如果wrapping爲True,則指針移動到最大值或最小值時可以繼續向對應方向移動,數值則跳轉到最小值或最大值
  • notchesVisible屬性:notchesVisible用於控制刻度盤上刻度線是否可見,可見時刻度線在錶盤上平均分佈
  • notchTarget屬性:notchTarget用於控制刻度盤上刻度線之間的像素數量,錶盤上刻度線的數量與4個屬性相關,分別是最小值minimum、最大值maximum、singleStep單步數值以及notchTarget屬性值,如果考慮notchTarget的值後錶盤上的空間足夠,刻度線的數量等於(maximum-minimum+1)/singleStep後四捨五入取整的值(假設爲count),如果notchTarget設置過大導致count*notchTarget的值超過整個錶盤的周長像素數,則只會繪製部分刻度線

除了構造方法以及上述屬性的訪問方法外,QDial的其他屬性、方法和信號都是從父類派生的,比較重要的包括:

  • 當刻度盤的指針移動時,刻度盤最初會連續發出valueChanged()信號和sliderMoved()信號,可以通過禁用跟蹤屬性使其發出valueChanged()信號的頻率降低,但sliderMoved()信號不受影響
  • 當拖拽指針移動時,按下和釋放鼠標按鈕時,刻度盤還會發出sliderPressed()和sliderReleased()信號
  • 與滑動條一樣,刻度表可以使用QAbstractSlider的setValue()槽方法。

在《第15.35節 PyQt編程實戰:結合QDial實現的QStackedWidget堆疊窗口程序例子》介紹了一個QDial的案例,大家可以回過頭去看下。

跟老猿學Python、學5G!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章