目錄
按鈕控制元件(QpushButton)
單選按鈕控制元件QRatioButton
復選框控制元件QCheckBox
下拉串列控制元件ComboBox
滑塊控制元件QSlider
滑塊步長和間隔的區別
計數器控制元件QSpinBox
按鈕控制元件(QpushButton)
QAbstractButton(所有按鈕控制元件的父類)
QPushButton(普通按鈕)
AToolButton(工具條按鈕)
QRadioButton(單選框按鈕)
QCheckBox(復選框按鈕)
代碼:
import sys
from PyQt5.QtCore import *
from PyQt5.QtGui import *
from PyQt5.QtWidgets import *
class QPushButtonDemo(QDialog):
def __init__(self):
super(QPushButtonDemo, self).__init__()
self.initUI()
def initUI(self):
self.setWindowTitle('QPushButton Demo')
self.resize(350,200)
layout=QVBoxLayout() #垂直布局
self.btn1=QPushButton('第一個按鈕')
self.btn1.setText('First Button1')
#下面兩句配合使用,功能類似于單選框按鈕QCheckBox
self.btn1.setCheckable(True)
self.btn1.toggle() #按一下就按下去了,再按一下才能抬起
#btn1一個信號對應兩個槽函式
self.btn1.clicked.connect(self.buttonState) #先系結誰系統就先呼叫誰
self.btn1.clicked.connect(lambda :self.whichButton(self.btn1))
layout.addWidget(self.btn1)
#在文本前面顯示影像
self.btn2=QPushButton('影像按鈕')
self.btn2.setIcon(QIcon(QPixmap('casually input')))
self.btn2.clicked.connect(lambda :self.whichButton(self.btn2))
layout.addWidget(self.btn2)
self.btn3=QPushButton('不可用的按鈕')
self.btn3.setEnabled(False)
layout.addWidget(self.btn3)
self.btn4=QPushButton('&MyButton') #設定了熱鍵M/m
self.btn4.setDefault(True) #如果沒有任何按鈕被選中,那么按回車就是按了這個按鈕
self.btn4.clicked.connect(lambda :self.whichButton(self.btn4))
layout.addWidget(self.btn4)
self.setLayout(layout)
'''
注意下面的方法是兩個引數,如果用傳統的信號與槽連接方式的話,只會將按鈕物件本身傳入,那樣的話第二個引數就沒有傳入值了
所以要用lambda運算式,當前物件直接呼叫這個函式,傳入的值就對應第二個引數了
'''
def whichButton(self,btn):
#self.sender() #通過此方法可得到是哪個按鈕被按下,或者可用此方法中的傳參方法
print('被單擊的按鈕是<'+btn.text()+'>')
def buttonState(self):
if self.btn1.isChecked():
print('按鈕1已經被選中')
else:
print('按鈕1未被選中')
if __name__=='__main__':
app=QApplication(sys.argv)
main=QPushButtonDemo()
main.show()
sys.exit(app.exec_())
運行結果:


開始啥都不要選,先按一個一個回車,果然按鈕4反應了,然后連按兩下按鈕1,再用熱鍵Alt+m,再點按鈕2,按鈕3點不了,
單選按鈕控制元件QRatioButton
在一個容器內的單選按鈕是互斥的,即選中了一個單選按鈕,就不能再選中另一個單選按鈕,也就是不能同時處于選中狀態,在不同容器中的單選按鈕是分開的,互不影響,
代碼:
import sys
from PyQt5.QtWidgets import *
from PyQt5.QtGui import *
from PyQt5.QtCore import *
class QRatioButtonDemo(QWidget):
def __init__(self):
super(QRatioButtonDemo, self).__init__()
self.initUI()
def initUI(self):
self.setWindowTitle('QRatioButton')
self.resize(350,100)
#水平布局
layout=QHBoxLayout()
self.btn1=QRadioButton('單選按鈕1')
# 設為默認是選中狀態
self.btn1.setChecked(True)
#toggled是狀態切換的信號
self.btn1.toggled.connect(self.buttonState)
layout.addWidget(self.btn1)
self.btn2=QRadioButton('單選按鈕2')
self.btn2.toggled.connect(self.buttonState)
layout.addWidget(self.btn2)
self.setLayout(layout)
def buttonState(self):
ratiobtn=self.sender()
if ratiobtn.isChecked() == True:
print('<' + ratiobtn.text() + '>被選中')
else:
print('<' + ratiobtn.text() + '>被取消選中狀態')
#同意容器下單選按鈕是互斥的,所以不必利用ratiobtn.text()來分情況判斷
'''
if ratiobtn.text()=='單選按鈕1':
#是否被選中
if ratiobtn.isChecked()==True:
print('<'+ratiobtn.text()+'>被選中')
else:
print('<'+ratiobtn.text()+'>被取消選中狀態')
if ratiobtn.text()=='單選按鈕2':
if ratiobtn.isChecked()==True:
print('<'+ratiobtn.text()+'>被選中')
else:
print('<'+ratiobtn.text()+'>被取消選中狀態')
'''
if __name__=='__main__':
app=QApplication(sys.argv)
main=QRatioButtonDemo()
main.show()
sys.exit(app.exec_())
運行結果:
(控制臺)
復選框控制元件QCheckBox
3種狀態:
未選中:0
半選中:1
選中:2
tristate屬性表示復選框是三種狀態還是兩種狀態,如果tristate為true,則表示復選框中有選中,半選中,未選中三種狀態,即setTristate(True)即表示允許半選中,
self.checkbox3.setCheckState(Qt.PartiallyChecked)可設定的三種狀態
代碼:
import sys
from PyQt5.QtWidgets import *
from PyQt5.QtGui import *
from PyQt5.QtCore import *
from PyQt5.QtCore import Qt #其中有許多常量
class QCheckBoxDemo(QWidget):
def __init__(self):
super(QCheckBoxDemo, self).__init__()
self.initUI()
def initUI(self):
self.setWindowTitle('QCheckBoxDemo')
self.resize(350,100)
layout=QHBoxLayout()
self.checkbox1=QCheckBox('復選框控制元件1')
#默認選中
self.checkbox1.setChecked(True)#此函式只有兩種狀態
self.checkbox1.stateChanged.connect(lambda :self.checkboxState(self.checkbox1))
layout.addWidget(self.checkbox1)
self.checkbox2=QCheckBox('復選框控制元件2')
self.checkbox2.stateChanged.connect(lambda: self.checkboxState(self.checkbox2))
layout.addWidget(self.checkbox2)
self.checkbox3=QCheckBox('半選中控制元件3')
#設定選中有三個狀態(即允許半選中)
self.checkbox3.setTristate(True)
#setCheckState函式有三種狀態:Unchecked,PartiallyChecked,Checked
self.checkbox3.setCheckState(Qt.PartiallyChecked)
self.checkbox3.stateChanged.connect(lambda: self.checkboxState(self.checkbox3))
layout.addWidget(self.checkbox3)
self.setLayout(layout)
def checkboxState(self,cb):
check1Status=self.checkbox1.text()+',isChecked='+str(self.checkbox1.isChecked())+',isCheckstate='+str(self.checkbox1.checkState())+'\n'
check2Status=self.checkbox2.text() + ',isChecked=' + str(self.checkbox2.isChecked()) + ',isCheckstate' + str(self.checkbox2.checkState()) + '\n'
check3Status=self.checkbox3.text() + ',isChecked=' + str(self.checkbox3.isChecked()) + ',isCheckstate' + str(self.checkbox3.checkState()) + '\n'
print(check1Status+check2Status+check3Status)
if __name__=='__main__':
app=QApplication(sys.argv)
main=QCheckBoxDemo()
main.show()
sys.exit(app.exec_())
運行結果:
可見半選框這種狀態時處于半選中狀態

此時半選框處于選中狀態
下拉串列控制元件ComboBox
代碼:
import sys
from PyQt5.QtWidgets import *
from PyQt5.QtGui import *
from PyQt5.QtCore import *
from PyQt5.QtCore import Qt #其中有許多常量
class QComboBoxDemo(QWidget):
def __init__(self):
super(QComboBoxDemo, self).__init__()
self.initUI()
def initUI(self):
self.setWindowTitle('QComboBoxDemo')
self.resize(350,100)
#垂直布局
layout=QVBoxLayout()
self.label=QLabel('請選擇編程語言')
self.cb=QComboBox()
self.cb.addItem('C++')
self.cb.addItem('Python')
self.cb.addItems(['Java','C#','Ruby'])
#每一項都對應一個下標索引
self.cb.currentIndexChanged.connect(self.selectionChange)#此信號默認傳遞兩個引數(控制元件本身,索引)
layout.addWidget(self.label)
layout.addWidget(self.cb)
self.setLayout(layout)
def selectionChange(self,i):
#標簽會隨著當前選中的下拉項而改變
self.label.setText(self.cb.currentText())
self.label.adjustSize()
for j in range(self.cb.count()):
print('item'+str(j)+'='+self.cb.itemText(j))
print('current index',i,'selection changed',self.cb.currentText())
if __name__=='__main__':
app=QApplication(sys.argv)
main=QComboBoxDemo()
main.show()
sys.exit(app.exec_())
運行結果:

滑塊控制元件QSlider
bug:
TypeError: __init__() takes 1 positional argument but 2 were given
我把類名直接命名成QSlider了,,,關于函式類這一塊的基礎知識有點忘了
代碼:
import sys
from PyQt5.QtWidgets import *
from PyQt5.QtGui import *
from PyQt5.QtCore import Qt #其中有許多常量
class QSliderDemo(QWidget):
def __init__(self):
super(QSliderDemo,self).__init__()
self.initUI()
def initUI(self):
self.setWindowTitle('QSliderDemo')
self.resize(350,500)
#垂直布局
layout=QVBoxLayout()
self.label=QLabel('Hello PyQt5!')
self.label.setAlignment(Qt.AlignCenter)
layout.addWidget(self.label)
#滑塊分為水平和垂直兩種
#水平slider1
self.slider1=QSlider(Qt.Horizontal)#水平,左右滑動
#設定最小值
self.slider1.setMinimum(12)
# 設定最大值
self.slider1.setMaximum(48)
#步長
self.slider1.setSingleStep(3)
#設定當前值
self.slider1.setValue(18)
#設定刻度的位置,刻度在下方
self.slider1.setTickPosition(QSlider.TicksBelow)
#刻度間隔
self.slider1.setTickInterval(6)
self.slider1.valueChanged.connect(self.valueChange)
#垂直slider2
self.slider2=QSlider(Qt.Vertical) #垂直滑塊
self.slider2.setMinimum(1)
self.slider2.setMaximum(80)
self.slider2.setSingleStep(5)
self.slider2.setTickPosition(QSlider.TicksLeft)#刻度條放在滑塊的左邊
self.slider2.setTickInterval(10)
self.slider2.valueChanged.connect(self.valueChange)
layout.addWidget(self.slider1)
layout.addWidget(self.slider2)
self.setLayout(layout)
def valueChange(self):
'''
注意這里是sender(),而不是slider1也不是slider2,sender()獲取當前操作的控制元件,
這樣無論拖動哪個滑動條字體大小都會變化,因為這倆信號對應這一個槽函式
'''
print('當前值:%s'% self.sender().value())
size=self.sender().value() #獲得當前值
#使字號根據當前值來變化
self.label.setFont(QFont('Arial',size))
if __name__=='__main__':
app=QApplication(sys.argv)
main=QSliderDemo()
main.show()
sys.exit(app.exec_())
運行結果:
倆個都行,自己試試吧,沒啥好說的
滑塊步長和間隔的區別
間隔就是刻度點的間隔,比如slider1刻度范圍是12-48,刻度間隔是6,所以有(48-12)/6=6個間隔,即7個刻度點
而對于步長,你先用滑鼠選中上圖中的任一個滑動條,然后用上下(或左右)鍵調節,每次調節的大小就是步長,
以slider1為例,易知步長是3,
計數器控制元件QSpinBox
代碼:
import sys
from PyQt5.QtWidgets import *
from PyQt5.QtGui import *
from PyQt5.QtCore import Qt #其中有許多常量
class QSpinBoxDemo(QWidget):
def __init__(self):
super(QSpinBoxDemo,self).__init__()
self.initUI()
def initUI(self):
####################################### 視窗設定
self.setWindowTitle('QSliderDemo')
self.resize(350,120)
#垂直布局
layout=QVBoxLayout()
######################################## 控制元件
self.label=QLabel('當前值')
self.label.setAlignment(Qt.AlignCenter)
self.sb=QSpinBox()
#默認值
self.sb.setValue(18)
#設定范圍
self.sb.setRange(10,38)
#設定步長
self.sb.setSingleStep(3)
####################################### 信號與槽
self.sb.valueChanged.connect(self.valueChange)
####################################### 組裝
layout.addWidget(self.label)
layout.addWidget(self.sb)
self.setLayout(layout)
def valueChange(self):
self.label.setText('當前值:'+str(self.sb.value()))
if __name__=='__main__':
app=QApplication(sys.argv)
main=QSpinBoxDemo()
main.show()
sys.exit(app.exec_())
運行結果:

轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/249486.html
標籤:python
下一篇:經典優化演算法——模擬退火
