簡體   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