摘要:有很多的控件,比如按鈕,單選框,滑動條,復(fù)選框等等。要設(shè)置窗口標(biāo)題,我們就要檢查單選框的狀態(tài)。我們創(chuàng)建了一個水平的進度條和一個按鈕,這個按鈕控制進度條的開始和停止。這個例子有日期組件和標(biāo)簽組件組成,標(biāo)簽顯示被選中的日期。
控件1
控件就像是應(yīng)用這座房子的一塊塊磚。PyQt5有很多的控件,比如按鈕,單選框,滑動條,復(fù)選框等等。在本章,我們將介紹一些很有用的控件:QCheckBox,ToggleButton,QSlider,QProgressBar和QCalendarWidget。
QCheckBoxQCheckBox組件有倆狀態(tài):開和關(guān)。通常跟標(biāo)簽一起使用,用在激活和關(guān)閉一些選項的場景。
#!/usr/bin/python3 # -*- coding: utf-8 -*- """ ZetCode PyQt5 tutorial 歡迎加入群`923 414 804`與我一起學(xué)習(xí) In this example, a QCheckBox widget is used to toggle the title of a window. Author: Jan Bodnar Website: zetcode.com Last edited: August 2017 """ from PyQt5.QtWidgets import QWidget, QCheckBox, QApplication from PyQt5.QtCore import Qt import sys class Example(QWidget): def __init__(self): super().__init__() self.initUI() def initUI(self): cb = QCheckBox("Show title", self) cb.move(20, 20) cb.toggle() cb.stateChanged.connect(self.changeTitle) self.setGeometry(300, 300, 250, 150) self.setWindowTitle("QCheckBox") self.show() def changeTitle(self, state): if state == Qt.Checked: self.setWindowTitle("QCheckBox") else: self.setWindowTitle(" ") if __name__ == "__main__": app = QApplication(sys.argv) ex = Example() sys.exit(app.exec_())
這個例子中,有一個能切換窗口標(biāo)題的單選框。
cb = QCheckBox("Show title", self)
這個是QCheckBox的構(gòu)造器。
cb.toggle()
要設(shè)置窗口標(biāo)題,我們就要檢查單選框的狀態(tài)。默認情況下,窗口沒有標(biāo)題,單選框未選中。
cb.stateChanged.connect(self.changeTitle)
把changeTitle()方法和stateChanged信號關(guān)聯(lián)起來。這樣,changeTitle()就能切換窗口標(biāo)題了。
def changeTitle(self, state): if state == Qt.Checked: self.setWindowTitle("QCheckBox") else: self.setWindowTitle("")
控件的狀態(tài)是由changeTitle()方法控制的,如果空間被選中,我們就給窗口添加一個標(biāo)題,如果沒被選中,就清空標(biāo)題。
程序展示:
切換按鈕切換按鈕就是QPushButton的一種特殊模式。 它只有兩種狀態(tài):按下和未按下。我們再點擊的時候切換兩種狀態(tài),有很多場景會使用到這個功能。
#!/usr/bin/python3 # -*- coding: utf-8 -*- """ ZetCode PyQt5 tutorial In this example, we create three toggle buttons. They will control the background color of a QFrame. Author: Jan Bodnar Website: zetcode.com Last edited: August 2017 """ from PyQt5.QtWidgets import (QWidget, QPushButton, QFrame, QApplication) from PyQt5.QtGui import QColor import sys class Example(QWidget): def __init__(self): super().__init__() self.initUI() def initUI(self): self.col = QColor(0, 0, 0) redb = QPushButton("Red", self) redb.setCheckable(True) redb.move(10, 10) redb.clicked[bool].connect(self.setColor) greenb = QPushButton("Green", self) greenb.setCheckable(True) greenb.move(10, 60) greenb.clicked[bool].connect(self.setColor) blueb = QPushButton("Blue", self) blueb.setCheckable(True) blueb.move(10, 110) blueb.clicked[bool].connect(self.setColor) self.square = QFrame(self) self.square.setGeometry(150, 20, 100, 100) self.square.setStyleSheet("QWidget { background-color: %s }" % self.col.name()) self.setGeometry(300, 300, 280, 170) self.setWindowTitle("Toggle button") self.show() def setColor(self, pressed): source = self.sender() if pressed: val = 255 else: val = 0 if source.text() == "Red": self.col.setRed(val) elif source.text() == "Green": self.col.setGreen(val) else: self.col.setBlue(val) self.square.setStyleSheet("QFrame { background-color: %s }" % self.col.name()) if __name__ == "__main__": app = QApplication(sys.argv) ex = Example() sys.exit(app.exec_())
我們創(chuàng)建了一個切換按鈕和一個QWidget,并把QWidget的背景設(shè)置為黑色。點擊不同的切換按鈕,背景色會在紅、綠、藍之間切換(而且能看到顏色合成的效果,而不是單純的顏色覆蓋)。
self.col = QColor(0, 0, 0)
設(shè)置顏色為黑色。
redb = QPushButton("Red", self) redb.setCheckable(True) redb.move(10, 10)
創(chuàng)建一個QPushButton,然后調(diào)用它的setCheckable()的方法就把這個按鈕編程了切換按鈕。
redb.clicked[bool].connect(self.setColor)
把點擊信號和我們定義好的函數(shù)關(guān)聯(lián)起來,這里是把點擊事件轉(zhuǎn)換成布爾值。
source = self.sender()
獲取被點擊的按鈕。
if source.text() == "Red": self.col.setRed(val)
如果是標(biāo)簽為“red”的按鈕被點擊,就把顏色更改為預(yù)設(shè)好的對應(yīng)顏色。
self.square.setStyleSheet("QFrame { background-color: %s }" % self.col.name())
使用樣式表(就是CSS的SS)改變背景色
程序展示:
滑塊QSlider是個有一個小滑塊的組件,這個小滑塊能拖著前后滑動,這個經(jīng)常用于修改一些具有范圍的數(shù)值,比文本框或者點擊增加減少的文本框(spin box)方便多了。
本例用一個滑塊和一個標(biāo)簽展示。標(biāo)簽為一個圖片,滑塊控制標(biāo)簽(的值)。
先弄個叫mute.png的靜音圖標(biāo)準(zhǔn)備著。
#!/usr/bin/python3 # -*- coding: utf-8 -*- """ ZetCode PyQt5 tutorial This example shows a QSlider widget. Author: Jan Bodnar Website: zetcode.com Last edited: August 2017 """ from PyQt5.QtWidgets import (QWidget, QSlider, QLabel, QApplication) from PyQt5.QtCore import Qt from PyQt5.QtGui import QPixmap import sys class Example(QWidget): def __init__(self): super().__init__() self.initUI() def initUI(self): sld = QSlider(Qt.Horizontal, self) sld.setFocusPolicy(Qt.NoFocus) sld.setGeometry(30, 40, 100, 30) sld.valueChanged[int].connect(self.changeValue) self.label = QLabel(self) self.label.setPixmap(QPixmap("mute.png")) self.label.setGeometry(160, 40, 80, 30) self.setGeometry(300, 300, 280, 170) self.setWindowTitle("QSlider") self.show() def changeValue(self, value): if value == 0: self.label.setPixmap(QPixmap("mute.png")) elif value > 0 and value <= 30: self.label.setPixmap(QPixmap("min.png")) elif value > 30 and value < 80: self.label.setPixmap(QPixmap("med.png")) else: self.label.setPixmap(QPixmap("max.png")) if __name__ == "__main__": app = QApplication(sys.argv) ex = Example() sys.exit(app.exec_())
這里是模擬的音量控制器。拖動滑塊,能改變標(biāo)簽位置的圖片。
sld = QSlider(Qt.Horizontal, self)
創(chuàng)建一個水平的QSlider。
self.label = QLabel(self) self.label.setPixmap(QPixmap("mute.png"))
創(chuàng)建一個QLabel組件并給它設(shè)置一個靜音圖標(biāo)。
sld.valueChanged[int].connect(self.changeValue)
把valueChanged信號跟changeValue()方法關(guān)聯(lián)起來。
if value == 0: self.label.setPixmap(QPixmap("mute.png")) ...
根據(jù)音量值的大小更換標(biāo)簽位置的圖片。這段代碼是:如果音量為0,就把圖片換成 mute.png。
程序展示:
進度條進度條是用來展示任務(wù)進度的(我也不想這樣說話)。它的滾動能讓用戶了解到任務(wù)的進度。QProgressBar組件提供了水平和垂直兩種進度條,進度條可以設(shè)置最大值和最小值,默認情況是0~99。
#!/usr/bin/python3 # -*- coding: utf-8 -*- """ ZetCode PyQt5 tutorial This example shows a QProgressBar widget. Author: Jan Bodnar Website: zetcode.com Last edited: August 2017 """ from PyQt5.QtWidgets import (QWidget, QProgressBar, QPushButton, QApplication) from PyQt5.QtCore import QBasicTimer import sys class Example(QWidget): def __init__(self): super().__init__() self.initUI() def initUI(self): self.pbar = QProgressBar(self) self.pbar.setGeometry(30, 40, 200, 25) self.btn = QPushButton("Start", self) self.btn.move(40, 80) self.btn.clicked.connect(self.doAction) self.timer = QBasicTimer() self.step = 0 self.setGeometry(300, 300, 280, 170) self.setWindowTitle("QProgressBar") self.show() def timerEvent(self, e): if self.step >= 100: self.timer.stop() self.btn.setText("Finished") return self.step = self.step + 1 self.pbar.setValue(self.step) def doAction(self): if self.timer.isActive(): self.timer.stop() self.btn.setText("Start") else: self.timer.start(100, self) self.btn.setText("Stop") if __name__ == "__main__": app = QApplication(sys.argv) ex = Example() sys.exit(app.exec_())
我們創(chuàng)建了一個水平的進度條和一個按鈕,這個按鈕控制進度條的開始和停止。
self.pbar = QProgressBar(self)
新建一個QProgressBar構(gòu)造器。
self.timer = QtCore.QBasicTimer()
用時間控制進度條。
self.timer.start(100, self)
調(diào)用start()方法加載一個時間事件。這個方法有兩個參數(shù):過期時間和事件接收者。
def timerEvent(self, e): if self.step >= 100: self.timer.stop() self.btn.setText("Finished") return self.step = self.step + 1 self.pbar.setValue(self.step)
每個QObject和又它繼承而來的對象都有一個timerEvent()事件處理函數(shù)。為了觸發(fā)事件,我們重載了這個方法。
def doAction(self): if self.timer.isActive(): self.timer.stop() self.btn.setText("Start") else: self.timer.start(100, self) self.btn.setText("Stop")
里面的doAction()方法是用來控制開始和停止的。
程序展示:
日歷QCalendarWidget提供了基于月份的日歷插件,十分簡易而且直觀。
#!/usr/bin/python3 # -*- coding: utf-8 -*- """ ZetCode PyQt5 tutorial This example shows a QCalendarWidget widget. Author: Jan Bodnar Website: zetcode.com Last edited: August 2017 """ from PyQt5.QtWidgets import (QWidget, QCalendarWidget, QLabel, QApplication, QVBoxLayout) from PyQt5.QtCore import QDate import sys class Example(QWidget): def __init__(self): super().__init__() self.initUI() def initUI(self): vbox = QVBoxLayout(self) cal = QCalendarWidget(self) cal.setGridVisible(True) cal.clicked[QDate].connect(self.showDate) vbox.addWidget(cal) self.lbl = QLabel(self) date = cal.selectedDate() self.lbl.setText(date.toString()) vbox.addWidget(self.lbl) self.setLayout(vbox) self.setGeometry(300, 300, 350, 300) self.setWindowTitle("Calendar") self.show() def showDate(self, date): self.lbl.setText(date.toString()) if __name__ == "__main__": app = QApplication(sys.argv) ex = Example() sys.exit(app.exec_())
這個例子有日期組件和標(biāo)簽組件組成,標(biāo)簽顯示被選中的日期。
cal = QCalendarWidget(self)
創(chuàng)建一個QCalendarWidget。
cal.clicked[QDate].connect(self.showDate)
選擇一個日期時,QDate的點擊信號就觸發(fā)了,把這個信號和我們自己定義的showDate()方法關(guān)聯(lián)起來。
def showDate(self, date): self.lbl.setText(date.toString())
使用selectedDate()方法獲取選中的日期,然后把日期對象轉(zhuǎn)成字符串,在標(biāo)簽里面顯示出來。
程序展示:
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/42997.html
摘要:工具可以直接使用方式安裝和的環(huán)境配置使用集成開發(fā)工具的小白,在安裝庫以后,還要對和進行環(huán)境配置,將其集成到中。如果小白的或安裝在其他路徑下,則從對應(yīng)的目錄找到,或者在資源管理器中搜索文件找到安裝路徑。 ...
摘要:庫是目前最強大的庫之一。是一組命令行參數(shù)的列表。可以在里運行,這個參數(shù)提供對腳本控制的功能。默認情況下,構(gòu)造器是沒有父級的,沒有父級的構(gòu)造器被稱為窗口。主循環(huán)從窗口上接收事件,并把事件傳入到派發(fā)到應(yīng)用控件里。方法能確保主循環(huán)安全退出。 showImg(https://segmentfault.com/img/remote/1460000018695864?w=1134&h=722); ...
摘要:控件是一個用戶界面的基本控件,它提供了基本的應(yīng)用構(gòu)造器。默認情況下,構(gòu)造器是沒有父級的,沒有父級的構(gòu)造器被稱為窗口。這就意味著,我們調(diào)用了兩個構(gòu)造器,一個是這個類本身的,一個是這個類繼承的。構(gòu)造器方法返回父級的對象。 本章學(xué)習(xí)Qt的基本功能 例1,簡單的窗口 這個簡單的小例子展示的是一個小窗口。但是我們可以在這個小窗口上面做很多事情,改變大小,最大化,最小化等,這需要很多代碼才能實現(xiàn)。...
閱讀 3114·2021-11-23 09:51
閱讀 1974·2021-09-09 09:32
閱讀 1084·2019-08-30 15:53
閱讀 2957·2019-08-30 11:19
閱讀 2464·2019-08-29 14:15
閱讀 1432·2019-08-29 13:52
閱讀 553·2019-08-29 12:46
閱讀 2818·2019-08-26 12:18