1.按鈕
QtWidgets
模塊提供了多種按鈕類,讓你可以輕松地創(chuàng)建各種類型的按鈕
1.1 QPushButton(普通按鈕)
QPushButton
是PyQt5中最常見的按鈕類型之一,用于觸發(fā)動作或執(zhí)行操作。通過信號與槽機制,你可以將按鈕的點擊事件與特定的函數(shù)或操作關聯(lián)起來。
import sys
from PyQt5.QtWidgets import QApplication,QWidget,QPushButton
if __name__ == '__main__':
app = QApplication(sys.argv)
w1 = QWidget()
w1.setWindowTitle("UI-按鈕")
# 創(chuàng)建一個普通按鈕
btn1 = QPushButton("登錄")
# 將按鈕添加到父級中
btn1.setParent(w1)
w1.show()
app.exec_()
1.2 QRadioButton(單選按鈕)
QRadioButton
用于在一組選項中進行單選,用戶只能選擇其中一個選項。
import sys
from PyQt5.QtWidgets import QApplication, QWidget, QRadioButton, QButtonGroup, QVBoxLayout
if __name__ == '__main__':
app = QApplication(sys.argv)
w1 = QWidget()
w1.setWindowTitle("UI-按鈕")
# 1. 創(chuàng)建一個布局容器
layout = QVBoxLayout()
# 2. 創(chuàng)建一個按鈕組(單選時使用)
radioBtnGroup = QButtonGroup()
# 3. 創(chuàng)建4個單選按鈕
btn1 = QRadioButton("唱")
btn2 = QRadioButton("跳")
btn3 = QRadioButton("rap")
btn4 = QRadioButton("籃球")
# 4. 將4個按鈕添加到按鈕組中
radioBtnGroup.addButton(btn1)
radioBtnGroup.addButton(btn2)
radioBtnGroup.addButton(btn3)
radioBtnGroup.addButton(btn4)
# 5. 將每個按鈕添加到布局容器中
layout.addWidget(btn1)
layout.addWidget(btn2)
layout.addWidget(btn3)
layout.addWidget(btn4)
# 6. 窗口組件設置畫布
w1.setLayout(layout)
w1.show()
app.exec_()
1.3 QCheckBox(復選框)
QCheckBox
用于在多個選項中進行多選,用戶可以選擇多個選項
import sys
from PyQt5.QtWidgets import QApplication, QWidget, QButtonGroup, QVBoxLayout, QCheckBox
if __name__ == '__main__':
app = QApplication(sys.argv)
w1 = QWidget()
w1.setWindowTitle("UI-按鈕")
btnNames = ["唱","跳","RAP","籃球"]
btnObjs = []
# 1. 創(chuàng)建一個布局容器
layout = QVBoxLayout()
for bt_name in btnNames:
# 2. 創(chuàng)建4個多選按鈕
temp_btn = QCheckBox(bt_name)
# 3. 將每個按鈕添加到布局容器中
layout.addWidget(temp_btn)
btnObjs.append(temp_btn)
# 4. 窗口組件設置畫布
w1.setLayout(layout)
w1.show()
app.exec_()
注意:多選框不要使用按鈕組對象,否則就變?yōu)槎噙x框的單選效果
1.4 按鈕的事件機制
在pyqt中,事件的調用過程是:
1.定義按鈕或元素
2.通過事件名稱.connect綁定事件
所以,我們需要定義事件的回調方法,注意,事件回調方法機制就保證事件內容是要返回回調可調用對象,建議在類中定義
1.4.1 用類的方式定義函數(shù)
import sys
from PyQt5.QtWidgets import QApplication, QWidget, QButtonGroup, QVBoxLayout, QCheckBox, QPushButton
class MyQtWindow():
def __init__(self):
self.__initUI()
def __initUI(self):
app = QApplication(sys.argv)
w1 = QWidget()
w1.setWindowTitle("UI-按鈕")
# 創(chuàng)建一個普通按鈕
btn1 = QPushButton("登錄")
# 綁定事件,單點擊的時候調用say方法
btn1.clicked.connect(self.say)
# 將按鈕添加到父級中
btn1.setParent(w1)
w1.show()
app.exec_()
def say(self):
print(f"你好")
if __name__ == '__main__':
window = MyQtWindow()
1.4.2 回調函數(shù)中傳遞參數(shù)
1.使用lambda表達式實現(xiàn)
btn1.clicked.connect(lambda x: self.say("123"))
...
def say(self,arg):
print(f"你好:{arg}")
在這個例子中,
lambda
函數(shù)將創(chuàng)建一個新的函數(shù),該函數(shù)接受一個參數(shù)x
,然后將這個參數(shù)和你的參數(shù)一起傳遞給say
函數(shù)。
2.定義輔助函數(shù)實現(xiàn)
btn1.clicked.connect(self.fuzhu_say)
...
# 輔助函數(shù)
def fuzhu_say(self):
self.say("參數(shù)")
def say(self,arg):
print(f"你好:{arg}")
輔助函數(shù)傳參需要在輔助函數(shù)中實現(xiàn),如果你需要傳遞關鍵字參數(shù),那么使用輔助函數(shù)可能是更好的選擇
1.5 控制元素的位置和大小
對應元素使用:setGeometry(p_x,p_y,w,h) 函數(shù)
# 創(chuàng)建一個普通按鈕
btn1 = QPushButton("登錄")
btn1.setGeometry(300,300,300,50)
btn1.setGeometry(300,300,300,50)
是一個在編程中設置圖形界面元素(例如按鈕)的位置和大小的語句。具體來說,這個語句的含義如下:
-
btn1
是一個按鈕對象的引用。 -
setGeometry
是一個方法,用于設置按鈕的大小和位置。 -
(300,300,300,50)
是一個四個數(shù)值的元組,分別表示按鈕的左邊界的x坐標、上邊界的y坐標、寬度和高度。
所以,btn1.setGeometry(300,300,300,50)
的意思就是設置 btn1
這個按鈕在界面上的位置為 (300,300),也就是將其左上角移動到屏幕的 (300,300) 位置,并且將其寬度設為300像素,高度設為50像素。
1.6 設置單選或多選選中或取消選中
self.male_radio.setChecked(True) # 設置選中
self.female_radio.setChecked(False) # 設置取消選中
2.文字
2.1 基礎文字-QLabel
用于顯示文本標簽,不支持用戶輸入。
# 創(chuàng)建一個標題文字
q_label = QLabel("姓名", w)
2.2 單行文本輸入-QLineEdit
用于收集用戶輸入的單行文本,不支持多行文本。
q_label = QLineEdit("姓名", w)
2.3 多行文本顯示-QTextBrowser
用于顯示多行文本,支持富文本、HTML等格式,但不支持用戶編輯。
q_label = QTextBrowser(w)
q_label.append("Hello World")
2.4 多行文本編輯器-QTextEdit
用于收集用戶輸入的多行文本,支持富文本、HTML等格式,同時也支持用戶編輯。
q_label = QTextEdit(w)
q_label.append("Hello World")
2.5 獲取輸入框值
(1) 單行文本輸入框獲取值
name = self.name_input.text()
(2) 多行文本輸入框獲取值
intro = self.intro_input.toPlainText()
2.6 清空輸入框值
(1)單行文本輸入框清空值
self.name_input.clear()
(2)多行文本輸入框清空值
self.intro_input.clear()
3. 表單綜合案例
import sys
from PyQt5.QtWidgets import QApplication, QWidget, QLabel, QLineEdit, QTextEdit, QVBoxLayout, QHBoxLayout, QRadioButton, QCheckBox, QPushButton
class FormApp(QWidget):
def __init__(self):
super().__init__()
self.init_ui()
def init_ui(self):
self.setWindowTitle('表單界面')
self.setGeometry(100, 100, 400, 300)
self.name_label = QLabel('姓名:')
self.name_input = QLineEdit()
self.intro_label = QLabel('自我介紹:')
self.intro_input = QTextEdit()
self.gender_label = QLabel('性別:')
self.male_radio = QRadioButton('男')
self.female_radio = QRadioButton('女')
self.hobby_label = QLabel('愛好:')
self.sports_checkbox = QCheckBox('體育')
self.music_checkbox = QCheckBox('音樂')
self.travel_checkbox = QCheckBox('旅游')
self.reset_button = QPushButton('重置')
self.submit_button = QPushButton('提交')
self.reset_button.clicked.connect(self.reset_form)
self.submit_button.clicked.connect(self.submit_form)
layout = QVBoxLayout()
layout.addWidget(self.name_label)
layout.addWidget(self.name_input)
layout.addWidget(self.intro_label)
layout.addWidget(self.intro_input)
layout.addWidget(self.gender_label)
layout.addWidget(self.male_radio)
layout.addWidget(self.female_radio)
layout.addWidget(self.hobby_label)
layout.addWidget(self.sports_checkbox)
layout.addWidget(self.music_checkbox)
layout.addWidget(self.travel_checkbox)
layout.addWidget(self.reset_button)
layout.addWidget(self.submit_button)
self.setLayout(layout)
def reset_form(self):
self.name_input.clear()
self.intro_input.clear()
self.male_radio.setChecked(True)
self.female_radio.setChecked(False)
self.sports_checkbox.setChecked(False)
self.music_checkbox.setChecked(False)
self.travel_checkbox.setChecked(False)
def submit_form(self):
name = self.name_input.text()
intro = self.intro_input.toPlainText()
gender = '男' if self.male_radio.isChecked() else '女'
hobbies = []
if self.sports_checkbox.isChecked():
hobbies.append('體育')
if self.music_checkbox.isChecked():
hobbies.append('音樂')
if self.travel_checkbox.isChecked():
hobbies.append('旅游')
print('姓名:', name)
print('自我介紹:', intro)
print('性別:', gender)
print('愛好:', ', '.join(hobbies))
if __name__ == '__main__':
app = QApplication(sys.argv)
form = FormApp()
form.show()
sys.exit(app.exec_())
4.下拉列表
下拉列表(ComboBox)是一種常見的用戶界面元素,它允許用戶從預定義的選項列表中選擇一個值。下拉列表通常用于提供選擇,而不是自由文本輸入。
self.label = QLabel('選擇您的喜好:')
self.combo_box = QComboBox()
self.combo_box.addItem('體育')
self.combo_box.addItem('音樂')
self.combo_box.addItem('旅游')
4.1 下拉獲取值
selected_value = self.comboBox.currentText() # 獲取當前選中的文本值
print("Selected Value:", selected_value)
4.2 下拉清空值
self.comboBox.clear() # 清空下拉框中的所有選項
4.3 下拉框選中值
通過下拉索引值選中(從0開始計數(shù))
default_index = 2 # 設置默認選中的索引(從0開始計數(shù))
self.comboBox.setCurrentIndex(default_index)
通過下拉框值選中
default_text = 'Item 2' # 設置默認選中的文本
self.comboBox.setCurrentText(default_text)
4.4 下拉框添加元素
items = ['Item 1', 'Item 2', 'Item 3', 'Item 4']
self.comboBox.addItems(items)
5.滑塊
在 PyQt5 中,滑塊(QSlider)是用于在一定范圍內選擇數(shù)值的界面元素。它允許用戶通過滑動滑塊來選擇一個值。
self.slider = QSlider() # 默認是水平滑塊
self.slider.setMinimum(0) # 設置最小值
self.slider.setMaximum(100) # 設置最大值
self.slider.setValue(50) # 設置默認值
self.slider.setTickPosition(QSlider.TicksBelow) # 設置刻度顯示在滑塊下方
self.slider.setTickInterval(10) # 設置刻度間隔
完整demo
import sys
from PyQt5.QtWidgets import QApplication, QMainWindow, QSlider, QLabel, QVBoxLayout, QWidget
class SliderExample(QMainWindow):
def __init__(self):
super().__init__()
self.initUI()
def initUI(self):
self.setWindowTitle('Slider Example')
self.setGeometry(100, 100, 300, 200)
layout = QVBoxLayout()
self.slider = QSlider() # 默認是水平滑塊
self.slider.setMinimum(0) # 設置最小值
self.slider.setMaximum(100) # 設置最大值
self.slider.setValue(50) # 設置默認值
self.slider.setTickPosition(QSlider.TicksBelow) # 設置刻度顯示在滑塊下方
self.slider.setTickInterval(10) # 設置刻度間隔
self.valueLabel = QLabel(f"Value: {self.slider.value()}") # 顯示當前值的標簽
layout.addWidget(self.slider)
layout.addWidget(self.valueLabel)
self.resetButton = QPushButton('Reset')
self.resetButton.clicked.connect(self.resetSlider)
layout.addWidget(self.resetButton)
self.central_widget = QWidget()
self.central_widget.setLayout(layout)
self.setCentralWidget(self.central_widget)
self.slider.valueChanged.connect(self.updateValueLabel) # 連接滑塊值變化的信號與槽函數(shù)
def updateValueLabel(self, value):
self.valueLabel.setText(f"Value: {value}")
def resetSlider(self):
self.slider.setValue(50) # 將滑塊值重置為默認值
if __name__ == '__main__':
app = QApplication(sys.argv)
window = SliderExample()
window.show()
sys.exit(app.exec_())
5.1 獲取值
self.slider.value()
5.2 重置與設置
self.slider.setValue(50) # 將滑塊值重置為默認值
5.3 值變化回調更新
self.slider.valueChanged.connect(self.updateValueLabel) # 連接滑塊值變化的信號與槽函數(shù)
def updateValueLabel(self, value):
self.valueLabel.setText(f"Value: {value}")
6.進度條
進度條(QProgressBar)是一種用于表示進度或完成度的界面元素。在 PyQt5 中,你可以使用進度條來顯示操作的進度,例如文件下載、任務執(zhí)行等
self.progressBar = QProgressBar() # 創(chuàng)建一個進度條
self.progressBar.setMinimum(0) # 設置最小值:0
self.progressBar.setMaximum(100) # 設置最大值 100
self.progressBar.setValue(0) # 設置初始值 0
完整demo
import sys
from PyQt5.QtWidgets import QApplication, QMainWindow, QProgressBar, QPushButton, QVBoxLayout, QWidget
class ProgressBarExample(QMainWindow):
def __init__(self):
super().__init__()
self.initUI()
def initUI(self):
self.setWindowTitle('Progress Bar Example')
self.setGeometry(100, 100, 300, 200)
layout = QVBoxLayout()
self.progressBar = QProgressBar() # 創(chuàng)建一個進度條
self.progressBar.setMinimum(0) # 設置最小值:0
self.progressBar.setMaximum(100) # 設置最大值 100
self.progressBar.setValue(0) # 設置初始值 0
layout.addWidget(self.progressBar)
self.startButton = QPushButton('Start')
self.startButton.clicked.connect(self.startProgress)
layout.addWidget(self.startButton)
self.resetButton = QPushButton('Reset')
self.resetButton.clicked.connect(self.resetProgress)
layout.addWidget(self.resetButton)
self.central_widget = QWidget()
self.central_widget.setLayout(layout)
self.setCentralWidget(self.central_widget)
def startProgress(self):
self.progressBar.setValue(0) # 開始時將進度條值重置為0
for i in range(101):
self.progressBar.setValue(i)
QApplication.processEvents() # 實時更新界面
if i == 100:
self.progressBar.setValue(100) # 完成后將進度條值重置為0
def resetProgress(self):
self.progressBar.setValue(0) # 將進度條值重置為0
if __name__ == '__main__':
app = QApplication(sys.argv)
window = ProgressBarExample()
window.show()
sys.exit(app.exec_())
6.1 設置值且更新
self.progressBar.setValue(60)
QApplication.processEvents() # 實時更新界面
6.2 獲取值
current_value = self.progressBar.value()
print("Current Value:", current_value)
7. 列表框
在 PyQt5 中,列表框(QListWidget)是用于顯示一系列項目(項)的界面元素。每個項目可以包含文本、圖像等內容。
self.listWidget = QListWidget() # 創(chuàng)建列表項
items = ['Item 1', 'Item 2', 'Item 3', 'Item 4']
for item_text in items:
list_item = QListWidgetItem(item_text) # 創(chuàng)建一個列表項目
self.listWidget.addItem(list_item) # 添加到列表中
完整案例:
import sys
from PyQt5.QtWidgets import QApplication, QMainWindow, QListWidget, QListWidgetItem, QPushButton, QVBoxLayout, QWidget
class ListWidgetExample(QMainWindow):
def __init__(self):
super().__init__()
self.initUI()
def initUI(self):
self.setWindowTitle('List Widget Example')
self.setGeometry(100, 100, 300, 200)
layout = QVBoxLayout()
self.listWidget = QListWidget() # 創(chuàng)建列表項
items = ['Item 1', 'Item 2', 'Item 3', 'Item 4']
for item_text in items:
list_item = QListWidgetItem(item_text) # 創(chuàng)建一個列表項目
self.listWidget.addItem(list_item) # 添加到列表中
layout.addWidget(self.listWidget)
self.addButton = QPushButton('Add Item')
self.addButton.clicked.connect(self.addItem)
layout.addWidget(self.addButton)
self.removeButton = QPushButton('Remove Item')
self.removeButton.clicked.connect(self.removeItem)
layout.addWidget(self.removeButton)
self.central_widget = QWidget()
self.central_widget.setLayout(layout)
self.setCentralWidget(self.central_widget)
def addItem(self):
new_item_text = 'New Item'
new_item = QListWidgetItem(new_item_text)
self.listWidget.addItem(new_item)
def removeItem(self):
selected_items = self.listWidget.selectedItems()
for item in selected_items:
self.listWidget.takeItem(self.listWidget.row(item))
if __name__ == '__main__':
app = QApplication(sys.argv)
window = ListWidgetExample()
window.show()
sys.exit(app.exec_())
7.1 將列表項目添加到指定列表中
new_item_text = 'New Item'
new_item = QListWidgetItem(new_item_text)
self.listWidget.addItem(new_item)
7.2 移除指定項目
item_to_remove = self.listWidget.item(2) # 獲取第3個項目(索引為2)
self.listWidget.takeItem(self.listWidget.row(item_to_remove))
7.3 設置默認選中
default_row = 1 # 設置默認選中第2個項目(索引為1)
self.listWidget.setCurrentRow(default_row)
7.4 清空選中
self.listWidget.clearSelection()
8. 表格
在 PyQt5 中,表格(QTableWidget)是一個用于顯示二維表格數(shù)據(jù)的界面元素。它類似于電子表格,可以在單元格中顯示文本、圖像等內容。
self.tableWidget = QTableWidget(4, 3) # 創(chuàng)建一個4行3列的表格
# 設置3個表頭
self.tableWidget.setHorizontalHeaderLabels(['Column 1', 'Column 2', 'Column 3'])
for row in range(4):
for col in range(3):
item = QTableWidgetItem(data[row][col]) # 創(chuàng)建一個表格元素 data[行][列]
self.tableWidget.setItem(row, col, item) # 添加元素
完整案例:
import sys
from PyQt5.QtWidgets import QApplication, QMainWindow, QTableWidget, QTableWidgetItem, QVBoxLayout, QWidget
class TableWidgetExample(QMainWindow):
def __init__(self):
super().__init__()
self.initUI()
def initUI(self):
self.setWindowTitle('Table Widget Example')
self.setGeometry(100, 100, 400, 300)
layout = QVBoxLayout()
self.tableWidget = QTableWidget(4, 3) # 創(chuàng)建一個4行3列的表格
# 設置3個表頭
self.tableWidget.setHorizontalHeaderLabels(['Column 1', 'Column 2', 'Column 3'])
self.populateTable()
layout.addWidget(self.tableWidget)
self.central_widget = QWidget()
self.central_widget.setLayout(layout)
self.setCentralWidget(self.central_widget)
def populateTable(self):
data = [
['Row 1, Col 1', 'Row 1, Col 2', 'Row 1, Col 3'],
['Row 2, Col 1', 'Row 2, Col 2', 'Row 2, Col 3'],
['Row 3, Col 1', 'Row 3, Col 2', 'Row 3, Col 3'],
['Row 4, Col 1', 'Row 4, Col 2', 'Row 4, Col 3']
]
for row in range(4):
for col in range(3):
item = QTableWidgetItem(data[row][col]) # 創(chuàng)建一個表格元素 data[行][列]
self.tableWidget.setItem(row, col, item) # 添加元素
if __name__ == '__main__':
app = QApplication(sys.argv)
window = TableWidgetExample()
window.show()
sys.exit(app.exec_())
8.1添加行
使用 insertRow(row)
方法可以在指定位置插入一行。
pythonCopy code
tableWidget.insertRow(row_index)
8.2添加列
使用 insertColumn(column)
方法可以在指定位置插入一列。
pythonCopy code
tableWidget.insertColumn(column_index)
8.3 設置單元格內容
使用 setItem(row, column, item)
方法可以將一個 QTableWidgetItem 對象放置到指定行和列的單元格中。
pythonCopy codeitem = QTableWidgetItem("Cell Value")
tableWidget.setItem(row_index, column_index, item)
8.4 獲取單元格內容
使用 item(row, column)
方法可以獲取指定行和列的單元格中的 QTableWidgetItem 對象。
pythonCopy codeitem = tableWidget.item(row_index, column_index)
cell_value = item.text() if item is not None else ""
8.6 合并單元格
使用 setSpan(row, column, row_span, column_span)
方法可以合并指定范圍內的單元格。
pythonCopy code
tableWidget.setSpan(row_index, column_index, row_span, column_span)
8.7 清除內容
使用 clear()
方法可以清除表格中的所有內容。
pythonCopy code
tableWidget.clear()
8.8 移除行和列
使用 removeRow(row)
和 removeColumn(column)
方法可以移除指定行和列。
pythonCopy codetableWidget.removeRow(row_index)
tableWidget.removeColumn(column_index)
8.9 設置單元格對齊
使用 item(row, column).setTextAlignment(alignment)
方法可以設置指定單元格的文本對齊方式。
pythonCopy codeitem = QTableWidgetItem("Aligned Text")
item.setTextAlignment(Qt.AlignCenter) # 或者 Qt.AlignLeft, Qt.AlignRight, Qt.AlignTop, Qt.AlignBottom 等
tableWidget.setItem(row_index, column_index, item)
8.10 綜合案例-帶操作列的表格
import sys
from PyQt5.QtWidgets import QApplication, QMainWindow, QTableWidget, QTableWidgetItem, QPushButton, QVBoxLayout, QWidget
class TableWithButtonsExample(QMainWindow):
def __init__(self):
super().__init__()
self.initUI()
def initUI(self):
self.setWindowTitle('Table with Buttons Example')
self.setGeometry(100, 100, 600, 400)
layout = QVBoxLayout()
self.tableWidget = QTableWidget(4, 4) # 創(chuàng)建一個4行4列的表格
self.tableWidget.setHorizontalHeaderLabels(['Select', 'Name', 'Age', 'Actions'])
self.populateTable()
layout.addWidget(self.tableWidget)
self.central_widget = QWidget()
self.central_widget.setLayout(layout)
self.setCentralWidget(self.central_widget)
def populateTable(self):
data = [
{'name': 'Alice', 'age': 25},
{'name': 'Bob', 'age': 30},
{'name': 'Carol', 'age': 28},
{'name': 'David', 'age': 22}
]
for row, item_data in enumerate(data):
select_item = QTableWidgetItem()
select_item.setFlags(select_item.flags() | Qt.ItemIsUserCheckable)
select_item.setCheckState(Qt.Unchecked)
self.tableWidget.setItem(row, 0, select_item)
name_item = QTableWidgetItem(item_data['name'])
self.tableWidget.setItem(row, 1, name_item)
age_item = QTableWidgetItem(str(item_data['age']))
self.tableWidget.setItem(row, 2, age_item)
view_button = QPushButton('View')
edit_button = QPushButton('Edit')
delete_button = QPushButton('Delete')
button_container = QWidget()
button_layout = QHBoxLayout()
button_layout.addWidget(view_button)
button_layout.addWidget(edit_button)
button_layout.addWidget(delete_button)
button_container.setLayout(button_layout)
self.tableWidget.setCellWidget(row, 3, button_container)
if __name__ == '__main__':
app = QApplication(sys.argv)
window = TableWithButtonsExample()
window.show()
sys.exit(app.exec_())
9. 時間選擇器
在 PyQt5 中,可以使用 QDateTimeEdit 組件來實現(xiàn)日期時間選擇器。
self.dateTimeEdit = QDateTimeEdit() # 創(chuàng)建一個時間選擇器
self.dateTimeEdit.setDateTime(QDateTime.currentDateTime()) # 設置默認值為當前日期時間
import sys
from PyQt5.QtWidgets import QApplication, QMainWindow, QDateTimeEdit, QVBoxLayout, QPushButton, QLabel, QWidget
from PyQt5.QtCore import QDateTime
class DateTimePickerExample(QMainWindow):
def __init__(self):
super().__init__()
self.initUI()
def initUI(self):
self.setWindowTitle('Date Time Picker Example')
self.setGeometry(100, 100, 300, 200)
layout = QVBoxLayout()
self.dateTimeEdit = QDateTimeEdit() # 創(chuàng)建一個時間選擇器
self.dateTimeEdit.setDateTime(QDateTime.currentDateTime()) # 設置默認值為當前日期時間
layout.addWidget(self.dateTimeEdit)
self.getValueButton = QPushButton('Get Value')
self.getValueButton.clicked.connect(self.getValue)
layout.addWidget(self.getValueButton)
self.clearValueButton = QPushButton('Clear Value')
self.clearValueButton.clicked.connect(self.clearValue)
layout.addWidget(self.clearValueButton)
self.valueLabel = QLabel()
layout.addWidget(self.valueLabel)
self.central_widget = QWidget()
self.central_widget.setLayout(layout)
self.setCentralWidget(self.central_widget)
def getValue(self):
selected_datetime = self.dateTimeEdit.dateTime()
formatted_datetime = selected_datetime.toString("yyyy-MM-dd HH:mm:ss")
self.valueLabel.setText(f"Selected Value: {formatted_datetime}")
def clearValue(self):
self.dateTimeEdit.clear() # 清空日期時間選擇器的值
self.valueLabel.setText("Selected Value: Cleared")
if __name__ == '__main__':
app = QApplication(sys.argv)
window = DateTimePickerExample()
window.show()
sys.exit(app.exec_())
9.1 設置時間
self.dateTimeEdit.setDateTime(QDateTime.currentDateTime()) # 設置默認值為當前日期時間
使用字符串日期設置:
time_str = "2023-08-21 15:30:00"
datetime_value = QDateTime.fromString(time_str, "yyyy-MM-dd HH:mm:ss")
self.dateTimeEdit.setDateTime(datetime_value)
9.2 獲取時間
selected_datetime = self.dateTimeEdit.dateTime()
formatted_datetime = selected_datetime.toString("yyyy-MM-dd HH:mm:ss")
10. 文件選擇器
import sys
from PyQt5.QtWidgets import QApplication, QMainWindow, QPushButton, QFileDialog
class FileDialogExample(QMainWindow):
def __init__(self):
super().__init__()
self.initUI()
def initUI(self):
self.setGeometry(100, 100, 300, 200)
self.setWindowTitle('File Dialog Example')
self.button = QPushButton('Open File Dialog', self)
self.button.setGeometry(100, 100, 150, 30)
self.button.clicked.connect(self.showFileDialog)
def showFileDialog(self):
options = QFileDialog.Options()
options |= QFileDialog.ReadOnly # 可選:設置文件選擇框為只讀模式
file_path, _ = QFileDialog.getOpenFileName(self, "Open File", "", "All Files (*);;Text Files (*.txt)", options=options)
if file_path:
print("Selected file:", file_path)
if __name__ == '__main__':
app = QApplication(sys.argv)
ex = FileDialogExample()
ex.show()
sys.exit(app.exec_())
點擊按鈕會彈出一個文件選擇框,允許你選擇文件。你可以根據(jù)自己的需求進行修改和擴展。在 getOpenFileName
方法中,你可以通過調整第四個參數(shù)的字符串來指定不同的文件過濾器。這個參數(shù)使用了一種類似于 “文件類型描述 (*擴展名);;文件類型描述 (*擴展名)” 的格式。
11. 顯示圖片
在 PyQt5 中,你可以使用
QLabel
來顯示圖片。要顯示圖片,你需要使用QPixmap
創(chuàng)建一個圖像對象,然后將它設置給QLabel
的setPixmap
方法。
import sys
from PyQt5.QtWidgets import QApplication, QMainWindow, QLabel, QVBoxLayout, QWidget
from PyQt5.QtGui import QPixmap
class ImageDisplayExample(QMainWindow):
def __init__(self):
super().__init__()
self.initUI()
def initUI(self):
self.setGeometry(100, 100, 400, 300)
self.setWindowTitle('Image Display Example')
central_widget = QWidget(self)
self.setCentralWidget(central_widget)
layout = QVBoxLayout()
central_widget.setLayout(layout)
self.image_label = QLabel(self)
layout.addWidget(self.image_label)
self.loadImage()
def loadImage(self):
pixmap = QPixmap('path_to_your_image.jpg') # 替換為你的圖片路徑
self.image_label.setPixmap(pixmap)
self.image_label.setAlignment(Qt.AlignCenter)
if __name__ == '__main__':
app = QApplication(sys.argv)
ex = ImageDisplayExample()
ex.show()
sys.exit(app.exec_())
在這個案例中,你需要將
'path_to_your_image.jpg'
替換為你自己的圖片文件的路徑。QPixmap
類用于加載圖片,而QLabel
則用于顯示圖像。通過調用setPixmap
方法,你可以將加載的圖像設置給QLabel
,然后使用setAlignment
方法來設置圖像在QLabel
中的對齊方式。
12. 工具欄
使用
QMenu
和QToolBar
來創(chuàng)建菜單和工具欄。菜單用于創(chuàng)建應用程序的導航菜單,而工具欄則提供了快速訪問常用功能的方式
import sys
from PyQt5.QtWidgets import QApplication, QMainWindow, QAction, QMenu, QToolBar
class MenuAndToolbarExample(QMainWindow):
def __init__(self):
super().__init__()
self.initUI()
def initUI(self):
self.setGeometry(100, 100, 800, 600)
self.setWindowTitle('Menu and Toolbar Example')
self.createMenu()
self.createToolbar()
def createMenu(self):
menubar = self.menuBar()
file_menu = menubar.addMenu('File')
edit_menu = menubar.addMenu('Edit')
new_action = QAction('New', self)
new_action.triggered.connect(self.newFile)
file_menu.addAction(new_action)
open_action = QAction('Open', self)
open_action.triggered.connect(self.openFile)
file_menu.addAction(open_action)
exit_action = QAction('Exit', self)
exit_action.triggered.connect(self.close)
file_menu.addAction(exit_action)
undo_action = QAction('Undo', self)
edit_menu.addAction(undo_action)
redo_action = QAction('Redo', self)
edit_menu.addAction(redo_action)
def createToolbar(self):
toolbar = QToolBar(self)
self.addToolBar(toolbar)
new_action = QAction('New', self)
new_action.triggered.connect(self.newFile)
toolbar.addAction(new_action)
open_action = QAction('Open', self)
open_action.triggered.connect(self.openFile)
toolbar.addAction(open_action)
save_action = QAction('Save', self)
toolbar.addAction(save_action)
def newFile(self):
print("New File")
def openFile(self):
print("Open File")
if __name__ == '__main__':
app = QApplication(sys.argv)
ex = MenuAndToolbarExample()
ex.show()
sys.exit(app.exec_())
我們創(chuàng)建了一個具有簡單菜單和工具欄的窗口。
QMenu
用于創(chuàng)建菜單,QToolBar
用于創(chuàng)建工具欄。我們創(chuàng)建了一個 “File” 菜單和一個 “Edit” 菜單,每個菜單都有相應的操作。在工具欄中,我們放置了 “New” 和 “Open” 功能的按鈕。當點擊菜單項或工具欄按鈕時,與之相關聯(lián)的槽函數(shù)將被觸發(fā)。在這個案例中,點擊 “New” 或 “Open” 菜單項或工具欄按鈕會分別調用
newFile
和openFile
方法,這里我們只是打印了一些文本,但你可以在這些方法中執(zhí)行自己的操作。
13. 隱藏窗口欄和設置窗口圖標
13.1 隱藏窗口欄
self.setWindowFlags(Qt.FramelessWindowHint) # 設置窗口標志位為無邊框
13.2 設置窗口圖標
要在 PyQt5 中設置窗口的小圖標(窗口圖標),你可以使用 QIcon
類來加載圖標文件,并將其設置給窗口對象的 setWindowIcon
方法
from PyQt5.QtGui import QIcon
icon = QIcon('path_to_your_icon.png') # 替換為你的圖標文件路徑
self.setWindowIcon(icon)
14. 網(wǎng)頁視圖
首先第一步需要安裝PyQtWebEngine模塊
pip install PyQtWebEngine
編寫代碼
import sys
from PyQt5.QtCore import QUrl
from PyQt5.QtWidgets import QApplication, QMainWindow, QVBoxLayout, QWidget
from PyQt5.QtWebEngineWidgets import QWebEngineView
class WebViewExample(QMainWindow):
def __init__(self):
super().__init__()
self.init_ui()
def init_ui(self):
self.setWindowTitle('網(wǎng)頁視圖示例')
self.setGeometry(100, 100, 800, 600)
self.webview = QWebEngineView()
self.webview.setUrl(QUrl('https://www.baidu.com')) # Load the OpenAI website
layout = QVBoxLayout()
layout.addWidget(self.webview)
central_widget = QWidget()
central_widget.setLayout(layout)
self.setCentralWidget(central_widget)
if __name__ == '__main__':
app = QApplication(sys.argv)
example = WebViewExample()
example.show()
sys.exit(app.exec_())
15.音頻和視頻播放器
QMediaPlayer
來實現(xiàn)音頻和視頻播放功能。
QMediaPlayer
是一個多媒體播放器,它可以用來播放音頻和視頻文件。
15.1 音樂播放器
import sys
from PyQt5.QtCore import QUrl
from PyQt5.QtWidgets import QApplication, QMainWindow, QPushButton, QVBoxLayout, QWidget
from PyQt5.QtMultimedia import QMediaPlayer, QMediaContent
class AudioPlayerExample(QMainWindow):
def __init__(self):
super().__init__()
self.init_ui()
def init_ui(self):
self.setWindowTitle('音頻播放器示例')
self.setGeometry(100, 100, 300, 100)
self.media_player = QMediaPlayer()
self.media_player.setMedia(QMediaContent(QUrl.fromLocalFile('static/msc.mp3'))) # Replace with your audio file path
self.play_button = QPushButton('播放')
self.play_button.clicked.connect(self.play_audio)
self.stop_button = QPushButton('暫停')
self.stop_button.clicked.connect(self.stop_audio)
layout = QVBoxLayout()
layout.addWidget(self.play_button)
layout.addWidget(self.stop_button)
central_widget = QWidget()
central_widget.setLayout(layout)
self.setCentralWidget(central_widget)
def play_audio(self):
self.media_player.play()
def stop_audio(self):
self.media_player.pause()
if __name__ == '__main__':
app = QApplication(sys.argv)
example = AudioPlayerExample()
example.show()
sys.exit(app.exec_())
16. 彈窗
16.1 消息框
QMessageBox:用于顯示各種類型的消息框,如信息、警告、錯誤等。
from PyQt5.QtWidgets import QApplication, QMainWindow, QPushButton, QMessageBox
class MyWindow(QMainWindow):
def __init__(self):
super().__init__()
button = QPushButton("Show Message Box", self)
button.clicked.connect(self.show_message_box)
def show_message_box(self):
QMessageBox.information(self, "Information", "This is an information message.")
app = QApplication([])
window = MyWindow()
window.show()
app.exec_()
16.2 操作對話框
QInputDialog:用于獲取用戶輸入的對話框。
from PyQt5.QtWidgets import QApplication, QMainWindow, QPushButton, QInputDialog
class MyWindow(QMainWindow):
def __init__(self):
super().__init__()
button = QPushButton("Get Input", self)
button.clicked.connect(self.get_input)
def get_input(self):
text, ok = QInputDialog.getText(self, "Input Dialog", "Enter your name:")
if ok:
print(f"Entered name: {text}")
app = QApplication([])
window = MyWindow()
window.show()
app.exec_()
16.3 文件對話框
QFileDialog:用于打開文件對話框或保存文件對話框。
from PyQt5.QtWidgets import QApplication, QMainWindow, QPushButton, QFileDialog
class MyWindow(QMainWindow):
def __init__(self):
super().__init__()
button = QPushButton("Open File", self)
button.clicked.connect(self.open_file)
def open_file(self):
options = QFileDialog.Options()
options |= QFileDialog.ReadOnly
file_name, _ = QFileDialog.getOpenFileName(self, "Open File", "", "All Files (*)", options=options)
if file_name:
print(f"Selected file: {file_name}")
app = QApplication([])
window = MyWindow()
window.show()
app.exec_()
代碼解釋:
options |= QFileDialog.ReadOnly
這個代碼的意思是將 options
變量與 QFileDialog.ReadOnly
進行按位或操作,并將結果賦值給 options
變量。
QFileDialog.ReadOnly
是一個常量,它表示一個標志,用于在 QFileDialog
中設置只讀選項。當你按位或操作符 |
將這個標志與其他選項組合時,你可以在 QFileDialog
中設置多個選項。
例如,假設你有以下代碼:
options = QFileDialog.Options()
options |= QFileDialog.ReadOnly
options |= QFileDialog.DontUseNativeDialog
這里,我們首先創(chuàng)建了一個空的 QFileDialog.Options
對象。然后,通過 options |= QFileDialog.ReadOnly
,我們將只讀選項添加到了 options
中。接著,通過 options |= QFileDialog.DontUseNativeDialog
,我們又將不使用原生對話框的選項添加到了 options
中。
最終,options
變量會包含這兩個選項的組合,你可以將其傳遞給 QFileDialog
的相關方法,以便按照所選的選項來打開文件對話框。
17. 打包方法
17.1 環(huán)境準備
首先安裝pyinstaller,使用安裝命令:pip install pyinstaller;使用清華大學鏡像源加快速度
pip install pyinstaller -i https://pypi.tuna.tsinghua.edu.cn/simple
17.2 進行打包
我們寫的python腳本是不能脫離python解釋器單獨運行的,所以在打包的時候,至少會將python解釋器和腳本一起打包,同樣,為了打包的exe能正常運行,會把我們所有安裝的第三方包一并打包到exe。
即使我們的項目只使用的一個requests包,但是可能我們還安裝了其他n個包,但是他不管,因為包和包只有依賴關系的。比如我們只裝了一個requests包,但是requests包會順帶裝了一些其他依賴的小包,所以為了安全,只能將所有第三方包+python解釋器一起打包。
1. 單文件打包
去除控制臺打包
pyinstaller -F -w 文件地址
帶控制臺打包文章來源:http://www.zghlxwxcb.cn/news/detail-708385.html
pyinstaller -F 文件地址
打包指定exe 圖標打包文章來源地址http://www.zghlxwxcb.cn/news/detail-708385.html
pyinstaller -F -i 圖標 主文件
2. 多文件打包
pyinstaller [主文件] -p [其他文件1] -p [其他文件2] --hidden-import [自建模塊1] --hidden-import [自建模塊2]
到了這里,關于【PyQT5教程】-02-UI組件的文章就介紹完了。如果您還想了解更多內容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網(wǎng)!