繁体   English   中英

如何将 PyQt 菜单栏添加到我的程序中?

[英]How do I add a PyQt menubar to my program?

我目前正在使用 PyQt5 为我的 Python 程序开发用户界面。

在我的程序中,我首先读取了 csv 文件,然后使用 pandas 创建了 dataframe。 到目前为止,这也有效。

现在我想用 PyQt5 创建一个用户界面。 这个界面应该包含一个带有两个按钮(“文件”和“运行”)的菜单栏,并且应该显示我的 dataframe (见图)

它最终应该是什么样子

第一个按钮我想读取我的 csv 文件,另一个我想启动程序。

目前,我的用户界面只能显示 dataframe (见图)

现在的样子

那是我目前的代码,随机 dataframe

import sys
import pandas as pd
from PyQt5.QtWidgets import QApplication, QTableView
from PyQt5.QtCore import QAbstractTableModel, Qt

df = pd.DataFrame({'A': ['AAAAAAAA11111111', 'xyz', 'xyz', 'xyz', 'xyz', 'xyz', 'xyz', 'xyz', 'xyz'],
                   'B': ['BBBBBBBB11111111', 'xyz', 'xyz', 'xyz', 'xyz', 'xyz', 'xyz', 'xyz', 'xyz'],
                   'C': ['CCCCCCCC11111111', 'xyz', 'xyz', 'xyz', 'xyz', 'xyz', 'xyz', 'xyz', 'xyz'],        
                   'D': ['CCCCCCCC11111111', 'xyz', 'xyz', 'xyz', 'xyz', 'xyz', 'xyz', 'xyz', 'xyz']})

class pandasModel(QAbstractTableModel):

    def __init__(self, data):
        QAbstractTableModel.__init__(self)
        self._data = data

    def rowCount(self, parent=None):
        return self._data.shape[0]

    def columnCount(self, parent=None):
        return self._data.shape[1]

    def data(self, index, role=Qt.DisplayRole):
        if index.isValid():
            if role == Qt.DisplayRole:
                return str(self._data.iloc[index.row(), index.column()])
        return None

    def headerData(self, col, orientation, role):
        if orientation == Qt.Horizontal and role == Qt.DisplayRole:
            return self._data.columns[col]
        return None

if __name__ == '__main__':
    app = QApplication(sys.argv)
    model = pandasModel(df)
    view = QTableView()
    view.setModel(model)
    view.resize(800, 300)
    view.horizontalHeader().setSectionResizeMode(1) 
    view.show()
    sys.exit(app.exec_())

为了维护我想要的用户界面,我创建了一个带有菜单栏的 PyQt Designer 界面(见图)。 但我不知道如何链接这两个接口。

来自 PyQt_Designer 的设计

来自 PyQt 设计器的代码:

from PyQt5 import QtCore, QtGui, QtWidgets


class Ui_MainWindow(object):
    def setupUi(self, MainWindow):

        MainWindow.setObjectName("MainWindow")
        MainWindow.resize(600, 300)
        icon = QtGui.QIcon()
        icon.addPixmap(QtGui.QPixmap("../../Desktop/index.png"), QtGui.QIcon.Normal, QtGui.QIcon.Off)

        MainWindow.setWindowIcon(icon)
        self.centralwidget = QtWidgets.QWidget(MainWindow)
        self.centralwidget.setObjectName("centralwidget")
        self.tableWidget = QtWidgets.QTableWidget(self.centralwidget)
        self.tableWidget.setGeometry(QtCore.QRect(0, 0, 600, 300))
        self.tableWidget.viewport().setProperty("cursor", QtGui.QCursor(QtCore.Qt.CrossCursor))
        self.tableWidget.setObjectName("tableWidget")
        self.tableWidget.setColumnCount(0)
        self.tableWidget.setRowCount(0)

        MainWindow.setCentralWidget(self.centralwidget)
        self.menubar = QtWidgets.QMenuBar(MainWindow)
        self.menubar.setGeometry(QtCore.QRect(0, 0, 600, 21))
        self.menubar.setObjectName("menubar")
        self.menuSelect = QtWidgets.QMenu(self.menubar)
        self.menuSelect.setObjectName("menuSelect")

        MainWindow.setMenuBar(self.menubar)
        self.statusbar = QtWidgets.QStatusBar(MainWindow)
        self.statusbar.setObjectName("statusbar")
        MainWindow.setStatusBar(self.statusbar)
        self.menubar.addAction(self.menuSelect.menuAction())

        self.retranslateUi(MainWindow)
        QtCore.QMetaObject.connectSlotsByName(MainWindow)

    def retranslateUi(self, MainWindow):
        _translate = QtCore.QCoreApplication.translate
        MainWindow.setWindowTitle(_translate("MainWindow", "Analyser"))
        self.menuSelect.setTitle(_translate("MainWindow", "Select File"))


if __name__ == "__main__":
    import sys
    app = QtWidgets.QApplication(sys.argv)
    MainWindow = QtWidgets.QMainWindow()
    ui = Ui_MainWindow()
    ui.setupUi(MainWindow)
    MainWindow.show()
    sys.exit(app.exec_())

如何向我的程序添加菜单栏,或者如何将我的程序链接到 PyQt Designer 的代码?

首先,阅读有关使用 Designer 的 PyQt 文档
长话短说,你不应该编辑由 pyuic 生成的 python 文件,而是创建你的代码并将生成的文件用作模块。 阅读文档,您就会明白(您可能想查看第三个示例)。

删除你添加的 QTableWidget(因为它是错误的小部件类型),将QTableView拖到主 window,设置布局(右键单击表格外部和 window 内的空白区域,以及 Z99938282F0407618EF42Z 中的水平或垂直“布局”子菜单),保存并重建 UI 文件。

此时,按照文档中的过程,您只需从 class __init__设置 model :

from PyQt5.QtWidgets import QApplication, QMainWindow
from PyQt5.QtCore import QAbstractTableModel, Qt
from ui_mainwindow import Ui_MainWindow

class pandasModel(QAbstractTableModel):
    # ...

class MainWindow(QMainWindow, Ui_MainWindow):
    def __init__(self):
        super().__init__()
        self.setupUi(self)

        self.model = pandasModel(df)
        self.tableView.setModel(self.model)

        self.actionOpen.triggered.connect(self.doSomething)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM