python pyqt5

资料:QT官网
笔记

安装环境

pip install pyqt5
# 最好用py3.7,亲测其他版本安装也许会有问题

安装失败:可以创建虚拟环境

一、pyqt第一个程序

import sys
from PyQt5.QtWidgets import QApplication, QWidget
if __name__ == '__main__':
    app = QApplication(sys.argv)
    w = QWidget()
    # 设置窗口标题
    w.setWindowTitle("第一个PyQt")
    # 展示窗口
    w.show()
    # 程序进行循环等待状态
    app.exec()

二、增加一个按钮

import sys
from PyQt5.QtWidgets import QApplication, QWidget, QPushButton

if __name__ == '__main__':
    app = QApplication(sys.argv)
    w = QWidget()
    # 设置窗口标题
    w.setWindowTitle("第一个PyQt程序")
    # 在窗口里面添加控件
    btn = QPushButton("按钮")
    # 设置按钮的父亲是当前窗口,等于是添加到窗口中显示
    btn.setParent(w)
    # 展示窗口
    w.show()
    # 程序进行循环等待状态
    app.exec()

三、创建一个文本

import sys
from PyQt5.QtWidgets import QApplication, QWidget, QLabel

if __name__ == '__main__':
    app = QApplication(sys.argv)
    w = QWidget()
    # 设置窗口标题
    w.setWindowTitle("第一个PyQt")
    # 下面创建一个Label(纯文本),在创建的时候指定了父对象
    label = QLabel("账号: ", w)
    # 显示位置与大小 : x, y , w, h
    label.setGeometry(20, 20, 30, 30)
    # 展示窗口
    w.show()
    # 程序进行循环等待状态
    app.exec()

QT的细节

一、connect 函数注意不要多次执行,代码不会出错,结果非预期

from PyQt5.QtWidgets import QApplication, QMainWindow, QPushButton, QVBoxLayout, QWidget
class MainWindow(QMainWindow):
    def __init__(self):
        super().__init__()
        central_widget = QWidget(self)
        self.setCentralWidget(central_widget)
        layout = QVBoxLayout()
        central_widget.setLayout(layout)
        button = QPushButton("Click me", self)
        layout.addWidget(button)
        
        # 连接信号两次
        button.clicked.connect(self.on_button_clicked)
        button.clicked.connect(self.on_button_clicked)

    def on_button_clicked(self):
        print("Button clicked")

if __name__ == '__main__':
    app = QApplication([])
    main_window = MainWindow()
    main_window.show()
    app.exec_()

二、在自定内的init初始化窗体的布局,更新组件就能,更新内容

# 本示例中,在别的成员函数内修改self.import_button,就能更新内容
class MyWindow(QMainWindow):
    def __init__(self):
        super().__init__()
        self.init_ui()
    def init_ui(self, dic_config = {}):
            self.import_button = QPushButton("导入文件")
        	self.import_button_update()

三、完整测试用例,json编辑界面

import sys
import json
import copy
from PyQt5.QtWidgets import QApplication, QMainWindow, QTableWidget, QTableWidgetItem, QVBoxLayout, QWidget, QPushButton, QFileDialog, QHBoxLayout, QLabel, QLineEdit, QStyledItemDelegate
from PyQt5.QtCore import Qt
from PyQt5.QtGui import QBrush, QColor
import pyqtgraph as pg

def convert_str_to_number(s):
    try:
        return int(s)
    except ValueError:
        try:
            return float(s)
        except ValueError:
            return None

class CustomDelegate(QStyledItemDelegate):
    def createEditor(self, parent, option, index):
        editor = QLineEdit(parent)
        editor.textChanged.connect(self.on_editor_text_changed)
        return editor
    
    def setEditorData(self, editor, index):
        editor.setText(index.data())
    
    def setModelData(self, editor, model, index):
        model.setData(index, editor.text())
    
    def on_editor_text_changed(self, text):
        print(f"Value changed to: {text}")

class MyWindow(QMainWindow):
    def __init__(self):
        super().__init__()
        self.json_dic = {}
        self.json_tmp = {}
        self.key_clicked = ""
        self.file_name = ""
        self.init_ui()
        self.setGeometry(300, 300, 600, 800)
        self.setWindowTitle('PyQt 表格示例')

    def draw_png(self, cell_value):
        # self.plot_widget.setBackground('w')
        # 设置轴的颜色为黑色
        self.plot_widget.clear()
        self.plot_widget.getAxis('bottom').setPen('k')
        self.plot_widget.getAxis('left').setPen('k')
        self.plot_widget.setMouseEnabled(x=False, y=False)

        if type(self.json_tmp[cell_value]) == float or type(self.json_tmp[cell_value]) == int:
            return 0
            # x = list(0)
            # y = list(self.json_tmp[cell_value])
        # 添加数据和数值标签
        else:
            x = [i for i in range(len(self.json_tmp[cell_value]))]
            y = self.json_tmp[cell_value]
        # 绘制折线图(黑色虚线)
        self.plot_widget.plot(x, y, pen=pg.mkPen('k', width=2, style=Qt.DashLine))
        for i in range(len(x)):
            label = pg.TextItem(text=str(y[i]), color='k', anchor=(0.5, 1.2))
            self.plot_widget.addItem(label)
            label.setPos(x[i], y[i])

    def import_button_update(self):
        self.import_button.setFixedSize(60, 30)
        self.import_button.clicked.connect(self.import_file)

    def save_file(self):
        print(self.json_tmp)
        with open("t.json", "w", encoding="utf-8") as file:
            json.dump(self.json_tmp, file, ensure_ascii=False, indent=4)

    def save_button_update(self):
        self.save_button.setFixedSize(60, 30)
        self.save_button.clicked.connect(self.save_file)

    def table_widget_left_update(self):
        horizontal_header_labels = ['名称']
        # self.table_widget = QTableWidget()   # 表格对象
        self.table_widget.setRowCount(len(self.json_dic.keys()))     # 设置表格的行数
        self.table_widget.setColumnCount(1)  # 设置表格的列数
        self.table_widget.setHorizontalHeaderLabels(horizontal_header_labels) # 设置表头
        self.table_widget.setColumnWidth(0, 350)  # 设置第一列的宽度为 200 像素
        self.table_widget.setMaximumWidth(360)

        # 添加表格数据
        sorted_list = sorted(self.json_dic.keys(), key=lambda s: (s.lower(), s))

        for row, value in enumerate(sorted_list):
            for col in range(1):
                # 每个单元格是一个QTableWidgetItem对象,设置的是单元格内容
                item = QTableWidgetItem(f"{value}")
                # 设置 QTableWidgetItem 为不可编辑
                item.setFlags(item.flags() & ~Qt.ItemIsEditable)
                # 设置鼠标悬停提示
                item.setToolTip(f"{value}")
                self.table_widget.setItem(row, col, item)
        # 连接 cellClicked 信号到槽函数
        # self.table_widget.cellClicked.connect(self.on_cell_clicked)

    def on_item_changed(self, item):
        row, column = item.row(), item.column()
        new_value = item.text()
        # self.json_tmp()

        # # 设置单元格字体颜色为红色
        # red_brush = QBrush(QColor("red"))
        # item.setForeground(red_brush)

        print(f"Cell ({row}, {column}) changed to {new_value}")
        # self.table_widget_middle.itemChanged.disconnect(self.on_item_changed)
        if type(self.json_tmp[self.key_clicked]) == list:
            self.json_tmp[self.key_clicked][row] = convert_str_to_number(new_value)
            pass
        else:
            self.json_tmp[self.key_clicked] = convert_str_to_number(new_value)
        print(self.json_tmp[self.key_clicked], type(self.json_tmp[self.key_clicked]))
        self.draw_png(self.key_clicked)
        self.table_widget_middle.itemChanged.disconnect(self.on_item_changed)


    def table_widget_middle_click(self):
        self.table_widget_middle.itemChanged.connect(self.on_item_changed)
        # self.table_widget_middle.doubleClicked.disconnect(self.table_widget_middle_click)
        print("++++++++++++++++++++++", self.key_clicked)
        # print()

    def table_widget_middle_update(self, cell_value = None):
        self.table_widget_middle.setMaximumWidth(360)
        red_brush = QBrush(QColor("red"))
        self.key_clicked = cell_value
        # self.table_widget_middle.itemChanged.connect(self.on_item_changed)
        # self.table_widget_middle.doubleClicked.connect(self.table_widget_middle_click)
        horizontal_header_labels = ['值']
        # print(self.json_tmp[cell_value])
        if cell_value != None:
            print(self.json_tmp[cell_value])
            print(self.json_tmp[cell_value], type(self.json_tmp[cell_value]))
            self.table_widget_middle.setColumnCount(1)  # 设置表格的列数
            self.table_widget_middle.setColumnWidth(0, 350)  # 设置第一列的宽度为 200 像素
            self.table_widget_middle.setHorizontalHeaderLabels(["值"]) # 设置表头

            if type(self.json_tmp[cell_value]) == list:
                # print(self.json_tmp[cell_value])
                # print(self.json_tmp[cell_value], type(self.json_tmp[cell_value]))
                self.table_widget_middle.setRowCount(len(self.json_tmp[cell_value]))     # 设置表格的行数
                for row, value in enumerate(self.json_tmp[cell_value]):
                    # if type(value) == int:
                    #     # print(self.json_tmp[cell_value])

                    #     item = QTableWidgetItem()  # 创建一个空的 QTableWidgetItem
                    #     item.setData(Qt.DisplayRole, self.json_tmp[cell_value][row])
                    #     self.table_widget_middle.setItem(row, 0, item)
                    if type(value) == float or type(value) == int:
                        item = QTableWidgetItem(str(self.json_tmp[cell_value][row]))
                        if self.json_tmp[cell_value][row] != self.json_dic[cell_value][row]:
                            item.setForeground(red_brush)
                        self.table_widget_middle.setItem(row, 0, item)


            # elif type(self.json_tmp[cell_value]) == int:
            #     print("xxxx")
            #     self.table_widget_middle.setRowCount(1)     # 设置表格的行数
            #     # print(self.json_tmp[cell_value])

            #     item = QTableWidgetItem()  # 创建一个空的 QTableWidgetItem
            #     item.setData(Qt.DisplayRole, self.json_tmp[cell_value])
            #     self.table_widget_middle.setItem(0, 0, item)
            
            elif type(self.json_tmp[cell_value]) == float or type(self.json_tmp[cell_value]) == int:
                self.table_widget_middle.setRowCount(1)     # 设置表格的行数
                item = QTableWidgetItem(str(self.json_tmp[cell_value]))
                if self.json_tmp[cell_value] != self.json_dic[cell_value]:
                    item.setForeground(red_brush)
                self.table_widget_middle.setItem(0, 0, item)
                print("++++++++++++")
        


# # 定义浮点数
# float_number = 0.100010000100001

# # 创建 QTableWidgetItem
# item = QTableWidgetItem(str(float_number))

# # 将 QTableWidgetItem 添加到 QTableWidget
# table.setItem(0, 0, item)


    def init_ui(self, dic_config = {}):
        self.import_button = QPushButton("导入文件")
        self.import_button_update()

        self.save_button = QPushButton("保存文件")
        self.save_button_update()

        self.table_widget = QTableWidget()   # 表格对象
        self.table_widget.cellClicked.connect(self.on_cell_clicked)
        # self.table_widget_left_update()

        self.table_widget_middle = QTableWidget()   # 表格对象
        self.table_widget_middle.doubleClicked.connect(self.table_widget_middle_click)
        # self.table_widget_middle.itemChanged.connect(self.on_item_changed)
        # self.table_widget_middle_update()
        # self.table_widget_middle.itemChanged.connect(self.on_item_changed)

        self.table_widget_value3 = QTableWidget()   # 表格对象
        self.plot_widget = pg.PlotWidget(self)
        self.plot_widget.setBackground('w')

        hbox = QHBoxLayout() # 水平布局
        hbox.addWidget(self.import_button)
        hbox.addWidget(self.save_button)
        label1 = QLabel() # 定义一个空的label,占右边空间
        hbox.addWidget(label1)

        vbox = QHBoxLayout() # 水平的布局
        vbox.addWidget(self.table_widget)
        vbox.addWidget(self.table_widget_middle)
        vbox.addWidget(self.plot_widget)

        Vbox = QVBoxLayout() # 垂直的布局
        Vbox.addLayout(hbox)
        Vbox.addLayout(vbox)

        central_widget = QWidget()
        central_widget.setLayout(Vbox)
        self.setCentralWidget(central_widget)
        # self.setGeometry(300, 300, 600, 800)
        # self.setWindowTitle('PyQt 表格示例')

    def load_json(self, file_name):
        with open(file_name, "r") as json_file:
            src_json = json.load(json_file)

        # print(src_json.keys())
        return src_json
    
    def on_cell_clicked(self, row, col):
        item = self.table_widget.item(row, col)
        cell_value = item.text()
        # print(cell_value)
        self.table_widget_middle_update(cell_value)
        self.draw_png(cell_value)
        # self.table_widget_middle.itemChanged.connect(self.on_item_changed)
        # self.init_ui(self.json_dic)


    def import_file(self):
        options = QFileDialog.Options()
        file_name, _ = QFileDialog.getOpenFileName(self, "选择文件", "", "所有文件 (*.json)", options=options)
        if file_name:
            self.file_name = file_name
            # self.file_label.setText(f"导入的文件:{file_name}")
            self.json_dic = self.load_json(file_name)
            self.json_tmp = copy.deepcopy(self.json_dic)
            self.table_widget_left_update()
            # self.init_ui(self.json_dic)
if __name__ == '__main__':
    app = QApplication(sys.argv)
    window = MyWindow()
    window.show()
    sys.exit(app.exec_())
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值