国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

【PyQT5教程】-02-UI組件

這篇具有很好參考價值的文章主要介紹了【PyQT5教程】-02-UI組件。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

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_()

【PyQT5教程】-02-UI組件,# PYQT5,qt,ui,開發(fā)語言

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_()

【PyQT5教程】-02-UI組件,# PYQT5,qt,ui,開發(fā)語言

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框的單選效果

【PyQT5教程】-02-UI組件,# PYQT5,qt,ui,開發(fā)語言

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)

【PyQT5教程】-02-UI組件,# PYQT5,qt,ui,開發(fā)語言

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)

【PyQT5教程】-02-UI組件,# PYQT5,qt,ui,開發(fā)語言

2.2 單行文本輸入-QLineEdit

用于收集用戶輸入的單行文本,不支持多行文本。

q_label = QLineEdit("姓名", w)

【PyQT5教程】-02-UI組件,# PYQT5,qt,ui,開發(fā)語言

2.3 多行文本顯示-QTextBrowser

用于顯示多行文本,支持富文本、HTML等格式,但不支持用戶編輯。

q_label = QTextBrowser(w)
q_label.append("Hello World")

【PyQT5教程】-02-UI組件,# PYQT5,qt,ui,開發(fā)語言

2.4 多行文本編輯器-QTextEdit

用于收集用戶輸入的多行文本,支持富文本、HTML等格式,同時也支持用戶編輯。

q_label = QTextEdit(w)
q_label.append("Hello World")

【PyQT5教程】-02-UI組件,# PYQT5,qt,ui,開發(fā)語言

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_())

【PyQT5教程】-02-UI組件,# PYQT5,qt,ui,開發(fā)語言

4.下拉列表

下拉列表(ComboBox)是一種常見的用戶界面元素,它允許用戶從預定義的選項列表中選擇一個值。下拉列表通常用于提供選擇,而不是自由文本輸入。

self.label = QLabel('選擇您的喜好:')
        self.combo_box = QComboBox()
        self.combo_box.addItem('體育')
        self.combo_box.addItem('音樂')
        self.combo_box.addItem('旅游')

【PyQT5教程】-02-UI組件,# PYQT5,qt,ui,開發(fā)語言

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)  # 設置刻度間隔

【PyQT5教程】-02-UI組件,# PYQT5,qt,ui,開發(fā)語言

完整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

【PyQT5教程】-02-UI組件,# PYQT5,qt,ui,開發(fā)語言

完整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) # 添加到列表中

【PyQT5教程】-02-UI組件,# PYQT5,qt,ui,開發(fā)語言

完整案例:

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) # 添加元素

【PyQT5教程】-02-UI組件,# PYQT5,qt,ui,開發(fā)語言

完整案例:

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_())

【PyQT5教程】-02-UI組件,# PYQT5,qt,ui,開發(fā)語言

9. 時間選擇器

在 PyQt5 中,可以使用 QDateTimeEdit 組件來實現(xiàn)日期時間選擇器。

self.dateTimeEdit = QDateTimeEdit() # 創(chuàng)建一個時間選擇器
self.dateTimeEdit.setDateTime(QDateTime.currentDateTime())  # 設置默認值為當前日期時間

【PyQT5教程】-02-UI組件,# PYQT5,qt,ui,開發(fā)語言

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_())

【PyQT5教程】-02-UI組件,# PYQT5,qt,ui,開發(fā)語言

點擊按鈕會彈出一個文件選擇框,允許你選擇文件。你可以根據(jù)自己的需求進行修改和擴展。在 getOpenFileName 方法中,你可以通過調整第四個參數(shù)的字符串來指定不同的文件過濾器。這個參數(shù)使用了一種類似于 “文件類型描述 (*擴展名);;文件類型描述 (*擴展名)” 的格式。

11. 顯示圖片

在 PyQt5 中,你可以使用 QLabel 來顯示圖片。要顯示圖片,你需要使用 QPixmap 創(chuàng)建一個圖像對象,然后將它設置給 QLabelsetPixmap 方法。

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 中的對齊方式。

【PyQT5教程】-02-UI組件,# PYQT5,qt,ui,開發(fā)語言

12. 工具欄

使用 QMenuQToolBar 來創(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_())

【PyQT5教程】-02-UI組件,# PYQT5,qt,ui,開發(fā)語言

我們創(chuàng)建了一個具有簡單菜單和工具欄的窗口。QMenu 用于創(chuàng)建菜單,QToolBar 用于創(chuàng)建工具欄。我們創(chuàng)建了一個 “File” 菜單和一個 “Edit” 菜單,每個菜單都有相應的操作。在工具欄中,我們放置了 “New” 和 “Open” 功能的按鈕。

當點擊菜單項或工具欄按鈕時,與之相關聯(lián)的槽函數(shù)將被觸發(fā)。在這個案例中,點擊 “New” 或 “Open” 菜單項或工具欄按鈕會分別調用 newFileopenFile 方法,這里我們只是打印了一些文本,但你可以在這些方法中執(zhí)行自己的操作。

13. 隱藏窗口欄和設置窗口圖標

13.1 隱藏窗口欄

self.setWindowFlags(Qt.FramelessWindowHint)  # 設置窗口標志位為無邊框

【PyQT5教程】-02-UI組件,# PYQT5,qt,ui,開發(fā)語言

13.2 設置窗口圖標

要在 PyQt5 中設置窗口的小圖標(窗口圖標),你可以使用 QIcon 類來加載圖標文件,并將其設置給窗口對象的 setWindowIcon 方法

from PyQt5.QtGui import QIcon

icon = QIcon('path_to_your_icon.png')  # 替換為你的圖標文件路徑
self.setWindowIcon(icon)

【PyQT5教程】-02-UI組件,# PYQT5,qt,ui,開發(fā)語言

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_())

【PyQT5教程】-02-UI組件,# PYQT5,qt,ui,開發(fā)語言

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_())

【PyQT5教程】-02-UI組件,# PYQT5,qt,ui,開發(fā)語言

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_()

【PyQT5教程】-02-UI組件,# PYQT5,qt,ui,開發(fā)語言

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_()

【PyQT5教程】-02-UI組件,# PYQT5,qt,ui,開發(fā)語言

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_()

【PyQT5教程】-02-UI組件,# PYQT5,qt,ui,開發(fā)語言

代碼解釋:

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 文件地址

帶控制臺打包

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)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。如若轉載,請注明出處: 如若內容造成侵權/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經(jīng)查實,立即刪除!

領支付寶紅包贊助服務器費用

相關文章

  • 【Python】pyqt5入門教程之第一個UI界面

    【Python】pyqt5入門教程之第一個UI界面

    1.pyqt5工具安裝 (1)使用pip工具安裝PyQt5工具: (2)安裝Qt Designer圖形界面開發(fā)工具: 安裝完成后所在路徑 (3)安裝QtDesigner 安裝完成后所在路徑 designer.exe路徑 啟動QtDesigner 2.第一個QT窗口程序 Pycharm配置 找到py文件,右鍵External Tool — QTDesigner—就可以啟動 QTDesigner .ui文件轉換

    2024年02月15日
    瀏覽(26)
  • 基于pyqt5開發(fā)的圖書管理系統(tǒng)UI(帶登錄頁面)

    基于pyqt5開發(fā)的圖書管理系統(tǒng)UI(帶登錄頁面)

    由于老師布置了關于圖書館UI界面的開發(fā)任務,因此做了這個UI界面,因為老師說用C#開發(fā),而自己也不會,使用就pyqt去實現(xiàn),希望這個UI界面對各位小伙伴有些幫助。UI主要是使用的designer去設計的,然后進行了界面的美化,對于里面的功能目前也只做了天氣的,但是因為這個

    2024年02月12日
    瀏覽(25)
  • PyQt5快速開發(fā)與實戰(zhàn) 9.7 UI層的自動化測試

    PyQt5快速開發(fā)與實戰(zhàn) 9.7 UI層的自動化測試

    9. 第9章 PyQt5 擴展應用 9.7 UI層的自動化測試 一般來說,UI層的自動化測試是通過工具或編寫腳本的方式來模擬手工測試的過程,通過運行腳本來執(zhí)行測試用例,從而模擬人工對軟件的功能進行驗證。 PyQt是Qt框架的Python語言實現(xiàn),對于單元測試,Python可以使用它內部自帶的單元

    2024年02月11日
    瀏覽(14)
  • 如何在pycharm里邊配置pyqt5、qt5-applications,使用拖拽功能設計UI界面

    如何在pycharm里邊配置pyqt5、qt5-applications,使用拖拽功能設計UI界面

    安裝pyqt5和qt5-applications 網(wǎng)上很多說要安裝pyqt5-tools,但是里邊并沒有找到designer.exe這個文件,最終是在qt5-applications里邊的Qt/bin找到了designer.exe文件。 在pycharm中配置designer working directory可以自己手動配置工程目錄,也可以直接點擊后面的按鈕選擇$ProjectFileDir$ 在pycharm中配置p

    2024年02月02日
    瀏覽(27)
  • pyqt5中.ui轉為.py

    在PyQt中,可以使用Qt Designer創(chuàng)建GUI的圖形界面,設計完成后可以將其保存為.ui文件。但是,這種文件不能直接用于Python代碼編程,必須將其轉換為Python腳本,才能在Python程序中使用該界面。 將.ui文件轉換為.py文件可以讓您的程序更加靈活和方便,因為.py文件中包含了用于構建

    2024年02月04日
    瀏覽(22)
  • Pyqt5實現(xiàn)新線程更新窗口UI

    Pyqt5實現(xiàn)新線程更新窗口UI

    我們用pyqt5開發(fā)窗口應用時,應用會執(zhí)行一些耗時的操作,如復制大量文件,下載大量數(shù)據(jù)等。一般情況下,在這些操作沒有完成時,窗口的UI處于“假死”狀態(tài),不會更新,只有所有操作完成后,窗口的狀態(tài)才會更新。這樣對用戶使用非常不友好。 使用多線程技術,在新線

    2024年02月13日
    瀏覽(23)
  • PyQt5 多線程和異步刷新UI

    以下簡介一個基本的PyQt程序。 需要導入的類主要來自三個包 from PyQt5.QtWidgets import 常用的控件 PyQt5.QtCore 核心功能類,如QT,QThread,pyqtSignal PyQt5.QtGui UI類,如QFont 基礎的程序結構: 注意: 使用join方法會讓主線程阻塞在這里,等待子線程結束,在里面可以設置阻塞的時間 a

    2024年02月11日
    瀏覽(18)
  • Pyqt5繼承被覆蓋的Ui界面類

    Pyqt5繼承被覆蓋的Ui界面類

    提示:文章寫完后,目錄可以自動生成,如何生成可參考右邊的幫助文檔 文章目錄 前言 一、現(xiàn)象描述? 二、使用步驟 1.生成界面類Py文件,獲取到生成的Ui界面類 2.新建一個py文件,繼承Ui界面類 總結 提示:這里可以添加本文要記錄的大概內容: PyQt使用designer每次設計Ui或者

    2024年02月03日
    瀏覽(28)
  • PYQT5 ui轉py后的調用

    PYQT5 ui轉py后的調用

    將程序按文件夾分好類,檢查時更加清晰如先建立resource文件夾,內部含images(存放圖片)、UI(存放UI文件),resource文件夾與main等設計界面程序并列,ui轉成py時放在resource文件夾下邊。 ?login_pane.py(將轉換好的login.py引用,在此處對界面進行設計) 將做好的界面類引到主界面

    2024年02月06日
    瀏覽(25)
  • Python - PyQT5 - ui文件轉為py文件

    Python - PyQT5 - ui文件轉為py文件

    在QTdesigner圖形化編輯工具中,有些控件我們是可以直接在編輯界面進行編輯的,有些是不可以編輯的,只能通過Python代碼進行編輯,不過總體來說,所有能夠通過圖形化編輯界面可以編輯的,都可以通過Python語言實現(xiàn)控制,這點是毋庸置疑的,不過為了更加美觀及降級軟件開

    2024年02月05日
    瀏覽(18)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領取紅包,優(yōu)惠每天領

二維碼1

領取紅包

二維碼2

領紅包