如何在PyQt5中连接两个QTableview之间的双击操作?

2024-09-27 00:22:15 发布

您现在位置:Python中文网/ 问答频道 /正文

双击第二个QTablview中的任何列单元格,然后它应该双击第二行中的第一个QTablview我应该如何执行此操作

例如:

生成了两个QTableview小部件,第一个QTableview小部件来自导入CSV文件,它有26行和4列,第4列仅可编辑,第二个QTableview小部件相对于第一个QTableWidgets自动生成,第一个QTableview小部件有1行和26列

如果在第二个QTableview中双击单元格索引(0,10),那么它将在第一个QTableview中双击行索引(10,0),那么如何添加此操作

import sys
from PyQt5 import QtCore as qtc
from PyQt5 import QtWidgets as qtw
from PyQt5 import QtGui as qtg
import os.path
import pandas as pd

class QTableWidgetDisabledItem(qtw.QItemDelegate):
    def createEditor(self, parent, option, index):
        return

class MainWindow(qtw.QMainWindow):
    def __init__(self, parent=None):

        super().__init__(parent)
        self.createUI()

    def createUI(self):

        self.resize(qtc.QSize(1200, 800))
        base_widget = qtw.QWidget()
        base_widget.setLayout(qtw.QHBoxLayout())
        notebook = qtw.QVBoxLayout()
        base_widget.layout().addLayout(notebook)
        self.file_list = qtw.QVBoxLayout()
        notebook.setSpacing(10)
        notebook.setContentsMargins(0, 0, 0, 0)
        base_widget.layout().addLayout(self.file_list)
        self.setCentralWidget(base_widget)

        # self.Detailbar = qtw.QHBoxLayout()
        self.Statusbar = qtw.QTableView()
        self.Statusbar.setEditTriggers(qtw.QAbstractItemView.NoEditTriggers)
        self.stausbar_model = qtg.QStandardItemModel(self)
        self.Statusbar.setModel(self.stausbar_model)
        self.Statusbar.setFixedHeight(70)
        notebook.addWidget(self.Statusbar)


        # CREATE THE TABLE
        self.tableWidget = qtw.QTableView()  # SELECTING THE VIEW
        self.tableWidget.setSelectionBehavior(qtw.QAbstractItemView.SelectRows)
        self.tableWidget.setGeometry(0, 0, 100, 100)
        self.model = qtg.QStandardItemModel(self)
        self.model.setHorizontalHeaderLabels(['ID', 'Category', 'Time','Comment'])   # SELECTING THE MODEL - FRAMEWORK THAT HANDLES QUERIES AND EDITS
        self.tableWidget.setModel(self.model)  # SETTING THE MODEL
        for i in range(3):
            delegate = QTableWidgetDisabledItem(self.tableWidget)
            self.tableWidget.setItemDelegateForColumn(i, delegate)

        self.model.itemChanged.connect(self.on_itemChanged)
        self.file_list.addWidget(self.tableWidget)

        #Actions Code
        open1 = qtw.QAction("&Open", self)
        open1.triggered.connect(self.OpenFile)

        exit = qtw.QAction("&Exit", self)
        exit.triggered.connect(sys.exit)

        menubar = self.menuBar()
        filemenu = menubar.addMenu("&File")
        filemenu.addAction(open1)
        filemenu.addSeparator()
        filemenu.addAction(exit)


    def populate(self):

        edited_csv_fname = self.fname   # Import CSV Files
        self.data = pd.read_csv(edited_csv_fname)

        values = []
        for i in range(len(self.data.index)):
            sub_values = []
            for j in range(len(self.data.columns)):
                value = self.data.iloc[i, j]
                sub_values.append(value)
            values.append(sub_values)

        for value in values:
            row = []
            for item in value:
                cell = qtg.QStandardItem(str(item))
                row.append(cell)
            self.model.appendRow(row)
        # print(self.model.rowCount())
        # self.statusbar_model.setRowCount(1)
        # self.statusbar_model.setColumnCount(len(self.data.index))
        qd = []
        for k in range(len(self.data.index)):
            qd.append(None)
            # qd.append(qtg.QStandardItem(None))
        self.stausbar_model.appendRow(qd)


    @qtc.pyqtSlot("QStandardItem*")
    def on_itemChanged(self, item):
        print(item.column())
        if item.column() == 3:
            it = self.statusbar_model.item(0, item.row())
            print(item.column)
            print(it)
            if it is None:
                it = qtg.QStandardItem()
                self.statusbar_model.setItem(0, item.row(), it)
            brush = (qtg.QBrush(qtg.QColor("red")) if item.text().strip() else qtg.QBrush())
            it.setBackground(brush)

    def OpenFile(self, filename=None):
        if filename is None or filename is False:
            print("Attempt to open up OpenFile")
            filenameraw = qtw.QFileDialog.getOpenFileName(self, "Open File", os.path.expanduser('~'))
            filename = filenameraw[0]
        if not filename:
            return
        # create the csv file media
        if sys.version < '3':
            filename = unicode(filename)
            print(filename)
            type(filename)

        self.fname = filename
        self.populate()



if __name__ == '__main__':
    app = qtw.QApplication(sys.argv) #it's required to save a referance to MainWindow
    mw = MainWindow()
    mw.show()
    sys.exit(app.exec_())
    #if it goes out of scope ,it will be destroyed

Tags: inimportselfnoneformodelifdef

热门问题