【PyQT5チュートリアル】-02-UIコンポーネント

1.ボタン

QtWidgetsこのモジュールにはさまざまなボタン クラスが用意されており、さまざまな種類のボタンを簡単に作成できます。

1.1 QPushButton(通常のボタン)

QPushButtonこれは PyQt5 で最も一般的なボタン タイプの 1 つであり、アクションをトリガーしたり、操作を実行したりするために使用されます。信号とスロットのメカニズムを通じて、ボタン クリック イベントを特定の機能または操作に関連付けることができます。

import sys

from PyQt5.QtWidgets import QApplication,QWidget,QPushButton

if __name__ == '__main__':

    app = QApplication(sys.argv)
    
    w1 = QWidget()
    w1.setWindowTitle("UI-按钮")

    # 创建一个普通按钮
    btn1 = QPushButton("登录")

    # 将按钮添加到父级中
    btn1.setParent(w1)

    w1.show()
    app.exec_()

ここに画像の説明を挿入します

1.2 QRadioButton(ラジオボタン)

QRadioButton一連のオプションの中から 1 つの選択を行うために使用されます。ユーザーはオプションのうち 1 つだけを選択できます。

import sys

from PyQt5.QtWidgets import QApplication, QWidget, QRadioButton, QButtonGroup, QVBoxLayout

if __name__ == '__main__':

    app = QApplication(sys.argv)

    w1 = QWidget()
    w1.setWindowTitle("UI-按钮")
    # 1. 创建一个布局容器
    layout = QVBoxLayout()
    # 2. 创建一个按钮组(单选时使用)
    radioBtnGroup = QButtonGroup()
    
    # 3. 创建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. 创建一个布局容器
    layout = QVBoxLayout()

    
    for bt_name in btnNames:
        # 2. 创建4个多选按钮
        temp_btn = QCheckBox(bt_name)
        # 3. 将每个按钮添加到布局容器中
        layout.addWidget(temp_btn)
        
        btnObjs.append(temp_btn)

    # 4. 窗口组件设置画布
    w1.setLayout(layout)

    w1.show()
    app.exec_()

注: ボタン グループ オブジェクトを複数選択ボックスに使用しないでください。使用すると、複数選択ボックスの単一選択効果になります。

ここに画像の説明を挿入します

1.4 ボタンイベントメカニズム

pyqt では、イベント呼び出しプロセスは次のとおりです。

1. ボタンまたは要素を定義します

2. イベント名.connect を通じてイベントをバインドします。

したがって、イベントのコールバック メソッドを定義する必要があります。イベント コールバック メソッドのメカニズムにより、イベント コンテンツがコールバック呼び出し可能オブジェクトを返すことが保証されることに注意してください。クラス内で定義することをお勧めします。

1.4.1 クラスを使用した関数の定義

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-按钮")

        # 创建一个普通按钮
        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 コールバック関数でパラメータを渡す

1. ラムダ式を使用して実装する

btn1.clicked.connect(lambda x: self.say("123"))

...

def say(self,arg):
    print(f"你好:{
      
      arg}")

この例では、lambda関数はパラメーターを受け入れる新しい関数を作成しx、このパラメーターをパラメーターとともに関数に渡しますsay

2. 補助機能の実装を定義する

btn1.clicked.connect(self.fuzhu_say)

...

# 辅助函数
    def fuzhu_say(self):
        self.say("参数")

    def say(self,arg):
        print(f"你好:{
      
      arg}")

補助関数にパラメータを渡すには、補助関数内で実装する必要があります。キーワード パラメータを渡す必要がある場合は、補助関数を使用することをお勧めします。

1.5 要素の位置とサイズを制御する

対応する要素は setGeometry(p_x,p_y,w,h) 関数を使用します。

# 创建一个普通按钮
        btn1 = QPushButton("登录")
        btn1.setGeometry(300,300,300,50)

ここに画像の説明を挿入します

btn1.setGeometry(300,300,300,50)は、プログラミングにおけるグラフィカル インターフェイス要素 (ボタンなど) の位置とサイズを設定するステートメントです。具体的には、このステートメントの意味は次のとおりです。

  • btn1ボタンオブジェクトへの参照です。
  • setGeometryボタンのサイズや位置を設定するメソッドです。
  • (300,300,300,50)これは、ボタンの左端の x 座標、上端の y 座標、幅、高さを表す 4 つの値のタプルです。

つまり、インターフェイス上のこのボタンの位置を (300,300) に設定すること、つまり、ボタンの左上隅を画面の (300,300) 位置に移動し、幅を 300 ピクセル、高さを 300 ピクセルに設定することを意味しますbtn1.setGeometry(300,300,300,50)btn150ピクセル。

1.6 単一選択または複数選択をオンまたはオフに設定する

self.male_radio.setChecked(True) # 设置选中
self.female_radio.setChecked(False) # 设置取消选中

2.文字

2.1 基本テキスト - QLabel

テキスト ラベルを表示するために使用され、ユーザー入力はサポートされません。

# 创建一个标题文字
q_label = QLabel("姓名", w)

ここに画像の説明を挿入します

2.2 単一行テキスト入力 - QLineEdit

ユーザー入力を収集するために使用される 1 行のテキスト。複数行のテキストはサポートされていません。

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 から数えます)

default_index = 2  # 设置默认选中的索引(从0开始计数)
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)は、一定の範囲内の値を選択するために使用されるインターフェース要素です。ユーザーはスライダーをスライドして値を選択できます。

self.slider = QSlider()  # 默认是水平滑块
        self.slider.setMinimum(0)  # 设置最小值
        self.slider.setMaximum(100)  # 设置最大值
        self.slider.setValue(50)  # 设置默认值
        self.slider.setTickPosition(QSlider.TicksBelow)  # 设置刻度显示在滑块下方
        self.slider.setTickInterval(10)  # 设置刻度间隔

ここに画像の説明を挿入します

完全なデモ

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)  # 连接滑块值变化的信号与槽函数

    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)  # 连接滑块值变化的信号与槽函数

def updateValueLabel(self, value):
        self.valueLabel.setText(f"Value: {
      
      value}")

6. プログレスバー

プログレス バー (QProgressBar) は、進行状況または完了を示すために使用されるインターフェイス要素です。PyQt5 では、プログレスバーを使用して、ファイルのダウンロードやタスクの実行などの操作の進行状況を表示できます。

self.progressBar = QProgressBar() # 创建一个进度条
self.progressBar.setMinimum(0) # 设置最小值:0
self.progressBar.setMaximum(100) # 设置最大值 100
self.progressBar.setValue(0) # 设置初始值 0

ここに画像の説明を挿入します

完全なデモ

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() # 创建一个进度条
        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)は、一連の項目(item)を表示するために使用されるインターフェース要素です。各項目にはテキスト、画像などを含めることができます。

self.listWidget = QListWidget() # 创建列表项

        items = ['Item 1', 'Item 2', 'Item 3', 'Item 4']
        for item_text in items:
            list_item = QListWidgetItem(item_text) # 创建一个列表项目
            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() # 创建列表项

        items = ['Item 1', 'Item 2', 'Item 3', 'Item 4']
        for item_text in items:
            list_item = QListWidgetItem(item_text) # 创建一个列表项目
            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) は 2 次元の表形式データを表示するために使用されるインターフェイス要素です。スプレッドシートに似ており、セル内にテキストや画像などを表示できます。

self.tableWidget = QTableWidget(4, 3)  # 创建一个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]) # 创建一个表格元素 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)  # 创建一个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]) # 创建一个表格元素 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)  # 创建一个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 コンポーネントを使用して日時ピッカーを実装できます。

self.dateTimeEdit = QDateTimeEdit() # 创建一个时间选择器
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() # 创建一个时间选择器
        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_())

ここに画像の説明を挿入します

ボタンをクリックするとファイル選択ボックスが表示され、ファイルを選択できます。ニーズに応じて変更および拡張できます。このメソッドではgetOpenFileName、4 番目のパラメーターの文字列を調整することで、さまざまなファイル フィルターを指定できます。このパラメータは、「ファイル タイプの説明 (* 拡張子);; ファイル タイプの説明 (* 拡張子)」のような形式を使用します。

11. 写真を表示する

PyQt5ではQLabel画像を表示するために使用できます。QPixmap画像を表示するには、を使用して画像オブジェクトを作成し、それを のメソッドに設定する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されたイメージを に設定しQLabelsetAlignmentメソッドを使用して でQLabelイメージの配置を設定できます。

ここに画像の説明を挿入します

12. ツールバー

QMenuと を使用してQToolBarメニューとツールバーを作成します。メニューはアプリケーションのナビゲーション メニューを作成するために使用され、ツールバーは頻繁に使用される機能にすばやくアクセスできるようにします。

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

ここに画像の説明を挿入します

シンプルなメニューとツールバーを備えたウィンドウを作成しました。QMenuメニューの作成に使用され、QToolBarツールバーの作成に使用されます。「ファイル」メニューと「編集」メニューを作成し、それぞれに対応するアクションを追加しました。ツールバーには、「新規」機能と「開く」機能のボタンを配置しました。

メニュー項目またはツールバー ボタンをクリックすると、それに関連付けられたスロット機能がトリガーされます。newFileこの場合、[新規] または [開く] メニュー項目またはツールバー ボタンをクリックすると、およびメソッドがそれぞれ呼び出されますopenFile。ここではテキストを印刷しただけですが、これらのメソッドで独自の操作を実行できます。

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.Webビュー

まず、最初のステップは 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('网页视图示例')
        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オーディオとビデオの再生機能を実装します。

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ビットごとの OR 演算を実行し、その結果をoptions変数に代入することです。

QFileDialog.ReadOnlyQFileDialogは、 に読み取り専用オプションを設定するフラグを表す定数です。ビットごとの OR 演算子を使用して|このフラグを他のオプションと組み合わせると、QFileDialogに複数のオプションを設定できます。

たとえば、次のコードがあるとします。

options = QFileDialog.Options()
options |= QFileDialog.ReadOnly
options |= QFileDialog.DontUseNativeDialog

ここでは、まず空のQFileDialog.Optionsオブジェクトを作成します。次に、 を介してoptions |= QFileDialog.ReadOnly、読み取り専用オプションを に追加しましたoptions次に、 を介してoptions |= QFileDialog.DontUseNativeDialog、ネイティブ ダイアログを使用しないオプションを に追加しましたoptions

最後に、options変数にはこれら 2 つのオプションの組み合わせが含まれます。これをQFileDialog関連メソッドに渡すと、選択したオプションでファイル ダイアログ ボックスを開くことができます。

17. 梱包方法

17.1 環境の準備

まず pyinstaller をインストールし、インストール コマンドを使用します: pip install pyinstaller; 高速化するには清華大学ミラー ソースを使用します

pip install pyinstaller -i https://pypi.tuna.tsinghua.edu.cn/simple

17.2 梱包

私たちが作成した Python スクリプトは、Python インタープリターから独立して実行することはできません。そのため、パッケージ化するときは、少なくとも Python インタープリターとスクリプトが一緒にパッケージ化されます。同様に、パッケージ化された exe が正常に実行されるようにするには、インストールされているすべてのサードパーティ パッケージが必要になります。一緒にexeに入れます。

私たちのプロジェクトで 1 つのリクエスト パッケージしか使用していないとしても、他の n 個のパッケージがインストールされている可能性がありますが、パッケージには依存関係しかないため、彼は気にしません。たとえば、ここでは、request パッケージを 1 つだけインストールしましたが、request パッケージは他の依存パッケージもインストールするため、安全のために、すべてのサードパーティ パッケージ + Python インタープリターを一緒にパッケージ化することしかできません。

1. 単一ファイルのパッケージ化

コンソールのパッケージを取り外します

pyinstaller -F -w 文件地址

コンソール同梱

pyinstaller -F 文件地址

指定されたexeアイコンパッケージをパッケージ化します。

pyinstaller -F -i 图标 主文件

2. 複数ファイルのパッケージ化

pyinstaller [主文件] -p [其他文件1] -p [其他文件2] --hidden-import [自建模块1] --hidden-import [自建模块2]

おすすめ

転載: blog.csdn.net/gjb760662328/article/details/132765000