python - 如何在 tabWidget 的两个 QTableView 中显示两个不同的 CSV 文件?
问题描述
我能够将 CSV 文件加载并写入到我的 QTableView 中,但是,我希望能够调整此代码,以便能够在两个单独的 tableViews 中为两个不同的 CSV 文件执行此操作,并带有 QTabWidget 的两个选项卡。
import sys
import csv
import fileinput
from PyQt5.QtCore import *
from PyQt5.QtWidgets import *
from PyQt5.QtGui import *
class MyWindow(QWidget):
def __init__(self, fileName, parent=None):
super(MyWindow, self).__init__(parent)
MyWindow.setGeometry(self, 0,0,800,420)
self.fileName = fileName
self.model = QStandardItemModel(self)
self.tableView = QTableView(self)
self.tableView.setModel(self.model)
self.tableView.horizontalHeader().setStretchLastSection(True)
self.pushButtonLoad = QPushButton(self)
self.pushButtonLoad.setText("Load Csv File!")
self.pushButtonLoad.clicked.connect(self.on_pushButtonLoad_clicked)
self.pushButtonWrite = QPushButton(self)
self.pushButtonWrite.setText("Write Csv File!")
self.pushButtonWrite.clicked.connect(self.on_pushButtonWrite_clicked)
self.layoutVertical = QVBoxLayout(self)
self.layoutVertical.addWidget(self.tableView)
self.layoutVertical.addWidget(self.pushButtonLoad)
self.layoutVertical.addWidget(self.pushButtonWrite)
def loadCsv(self, fileName):
with open(fileName, "r") as fileInput:
for row in csv.reader(fileInput):
items = [
QStandardItem(field)
for field in row
]
self.model.appendRow(items)
#self.model.layoutChanged.emit()
def writeCsv(self, fileName):
with open(fileName, "w") as fileOutput:
writer = csv.writer(fileOutput, lineterminator='\n')
print('rowCount->', self.model.rowCount())
for rowNumber in range(self.model.rowCount()):
fields = [
self.model.data(
self.model.index(rowNumber, columnNumber),
Qt.DisplayRole
)
for columnNumber in range(self.model.columnCount())
]
print('fields->', fields)
writer.writerow(fields)
@pyqtSlot()
def on_pushButtonWrite_clicked(self):
self.writeCsv(self.fileName)
self.model.layoutChanged.emit()
@pyqtSlot()
def on_pushButtonLoad_clicked(self):
self.loadCsv(self.fileName)
if __name__ == "__main__":
import sys
app = QApplication(sys.argv)
app.setApplicationName('MyWindow')
main = MyWindow("C:\Qt\csv.csv")
main.show()
sys.exit(app.exec_())
我知道如何将两个表视图添加到单独的选项卡小部件,它只是加载和写入按钮处理两个单独的 csv 文件的方法。
解决方案
在您的情况下,每个选项卡中应该有 2 个相同类型的小部件,因此创建自定义类是一个不错的选择。另一方面,最好通过对话获取 CSV,因为如果要加载另一个文件,则必须修改代码,而用户不应该这样做。最后,我将创建一个 QMainWindow 放置 QTabWidget 的位置,并在每个选项卡中设置自定义小部件。
import sys
import csv
from PyQt5 import QtCore, QtGui, QtWidgets
class Widget(QtWidgets.QWidget):
def __init__(self, parent=None):
super(Widget, self).__init__(parent)
self.setGeometry(0, 0, 800, 420)
self.model = QtGui.QStandardItemModel(self)
self.tableView = QtWidgets.QTableView()
self.tableView.setModel(self.model)
self.tableView.horizontalHeader().setStretchLastSection(True)
self.pushButtonLoad = QtWidgets.QPushButton("Load Csv File!",
clicked=self.on_pushButtonLoad_clicked)
self.pushButtonWrite = QtWidgets.QPushButton("Write Csv File!",
clicked=self.on_pushButtonWrite_clicked)
layoutVertical = QtWidgets.QVBoxLayout(self)
layoutVertical.addWidget(self.tableView)
layoutVertical.addWidget(self.pushButtonLoad)
layoutVertical.addWidget(self.pushButtonWrite)
def loadCsv(self, fileName):
self.model.clear()
with open(fileName, "r") as fileInput:
for row in csv.reader(fileInput):
items = [
QtGui.QStandardItem(field)
for field in row
]
self.model.appendRow(items)
def writeCsv(self, fileName):
with open(fileName, "w") as fileOutput:
writer = csv.writer(fileOutput, lineterminator='\n')
print('rowCount->', self.model.rowCount())
for rowNumber in range(self.model.rowCount()):
fields = [
self.model.item(rowNumber, columnNumber).text()
for columnNumber in range(self.model.columnCount())
]
print('fields->', fields)
writer.writerow(fields)
@QtCore.pyqtSlot()
def on_pushButtonWrite_clicked(self):
fileName, _ = QtWidgets.QFileDialog.getSaveFileName(self, self.tr("Open CSV"),
QtCore.QDir.currentPath(), self.tr("CSV Files (*.csv)"))
if fileName:
self.writeCsv(fileName)
@QtCore.pyqtSlot()
def on_pushButtonLoad_clicked(self):
fileName, _ = QtWidgets.QFileDialog.getOpenFileName(self, self.tr("Open CSV"),
QtCore.QDir.currentPath(), self.tr("CSV Files (*.csv)"))
if fileName:
self.loadCsv(fileName)
class MainWindow(QtWidgets.QMainWindow):
def __init__(self, parent=None):
super(MainWindow, self).__init__(parent)
tabwidget = QtWidgets.QTabWidget()
self.setCentralWidget(tabwidget)
tabwidget.addTab(Widget(), "tab1")
tabwidget.addTab(Widget(), "tab2")
if __name__ == "__main__":
import sys
app = QtWidgets.QApplication(sys.argv)
app.setApplicationName('MyWindow')
main = MainWindow()
main.show()
sys.exit(app.exec_())
推荐阅读
- linux - ec2如何向现有设备添加更多卷
- angular - Angular 2+ 路由器 - 延迟加载子项
- css - 在 NUXTjs 中提取 CSS 生成
- javascript - 外部 API - JSON 数据不接受“#”谷歌表格。
- github - Sonarqube Git Hub 插件
- meteor - 如何知道在流星火焰模板中完成或重新完成的“每个”
- 3dsmax - 使用 3dsmax python api 获取顶点权重骨骼数
- gensim - gensim tfidf 唯一标记数与特征数
- mysql - MySQL - 如果存在一个表中的列,则使用它,否则从另一个表中获取它
- spring-boot - Log4j2 导致的 Bean Validation 异常