[英]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.