RError.com

RError.com Logo RError.com Logo

RError.com Navigation

  • 主页

Mobile menu

Close
  • 主页
  • 系统&网络
    • 热门问题
    • 最新问题
    • 标签
  • Ubuntu
    • 热门问题
    • 最新问题
    • 标签
  • 帮助
主页 / 问题 / 1349791
Accepted
Arch Cat
Arch Cat
Asked:2022-04-15 00:32:11 +0000 UTC2022-04-15 00:32:11 +0000 UTC 2022-04-15 00:32:11 +0000 UTC

QTableWidget,表之间复制数据

  • 772

有一个用Qt Designer制作的小应用程序,它有两个QTableWidget带有一些数据的表(DataTable_1, DataTable_2)。

我找到了适合我的解决方案 ( https://quares.ru/?id=193989 ),但不幸的是我无法为自己正确应用它。

我是这样做的:

import sys
from PyQt5 import QtWidgets, QtCore
import design

class ExampleApp(QtWidgets.QMainWindow, design.Ui_MainWindow):
def __init__(self):
    super().__init__()
    self.setupUi(self)
    self.deleteRow_1.clicked.connect(self.delete_row_1)
    self.addRow_1.clicked.connect(self.add_row_1)
    self.deleteRow_2.clicked.connect(self.delete_row_2)
    self.addRow_2.clicked.connect(self.add_row_2)

def keyPressEvent(self, event):
    super().keyPressEvent(event)
    if event.key() == QtCore.Qt.Key_C and (event.modifiers() & QtCore.Qt.ControlModifier):
        self.DataTable_1.copied_cells = sorted(self.DataTable_1.selectedIndexes())
    elif event.key() == QtCore.Qt.Key_V and (event.modifiers() & QtCore.Qt.ControlModifier):
        r = self.DataTable_1.currentRow() - self.DataTable_1.copied_cells[0].row()
        c = self.DataTable_1.currentColumn() - self.DataTable_1.copied_cells[0].column()
        for cell in self.DataTable_1.copied_cells:
            self.DataTable_1.setItem(cell.row() + r, cell.column() + c, QtWidgets.QTableWidgetItem(cell.data()))

def add_row_1(self):
    row_position = self.DataTable_1.rowCount()
    self.DataTable_1.insertRow(row_position)

def delete_row_1(self):
    rows = set()
    for index in self.DataTable_1.selectedIndexes():
        rows.add(index.row())
    for row in sorted(rows, reverse=True):
        self.DataTable_1.removeRow(row)

def add_row_2(self):
    row_position = self.DataTable_2.rowCount()
    self.DataTable_2.insertRow(row_position)

def delete_row_2(self):
    rows = set()
    for index in self.DataTable_2.selectedIndexes():
        rows.add(index.row())
    for row in sorted(rows, reverse=True):
        self.DataTable_2.removeRow(row)

def main():
    app = QtWidgets.QApplication(sys.argv)
    window = ExampleApp()
    window.show()
    app.exec_()


if __name__ == '__main__':
    main()

pastebin design.py 上的代码

使用 tableDataTable_1一切正常,但我不能对 table 做同样的事情DataTable_2。理想情况下,我还希望能够在表之间复制数据。谢谢你。

python
  • 1 1 个回答
  • 10 Views

1 个回答

  • Voted
  1. Best Answer
    S. Nick
    2022-04-15T03:41:41Z2022-04-15T03:41:41Z

    我试图为你做点什么,并标记了没有变化的块。

    import sys
    from PyQt5 import QtCore, QtGui, QtWidgets
    from PyQt5 import QtWidgets, QtCore
    
    #import design
    class Ui_MainWindow(object):
        def setupUi(self, MainWindow):
                MainWindow.setObjectName("MainWindow")
                MainWindow.resize(602, 421)
                sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Fixed, QtWidgets.QSizePolicy.Fixed)
                sizePolicy.setHorizontalStretch(0)
                sizePolicy.setVerticalStretch(0)
                sizePolicy.setHeightForWidth(MainWindow.sizePolicy().hasHeightForWidth())
                MainWindow.setSizePolicy(sizePolicy)
                MainWindow.setStyleSheet("")
                MainWindow.setTabShape(QtWidgets.QTabWidget.Triangular)
                self.centralwidget = QtWidgets.QWidget(MainWindow)
                self.centralwidget.setObjectName("centralwidget")
                self.verticalLayout = QtWidgets.QVBoxLayout(self.centralwidget)
                self.verticalLayout.setObjectName("verticalLayout")
                self.tabWidget = QtWidgets.QTabWidget(self.centralwidget)
                self.tabWidget.setEnabled(True)
                sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Expanding)
                sizePolicy.setHorizontalStretch(0)
                sizePolicy.setVerticalStretch(0)
                sizePolicy.setHeightForWidth(self.tabWidget.sizePolicy().hasHeightForWidth())
                self.tabWidget.setSizePolicy(sizePolicy)
                self.tabWidget.setObjectName("tabWidget")
                self.tab = QtWidgets.QWidget()
                self.tab.setObjectName("tab")
                self.verticalLayout_2 = QtWidgets.QVBoxLayout(self.tab)
                self.verticalLayout_2.setObjectName("verticalLayout_2")
                self.horizontalLayout_3 = QtWidgets.QHBoxLayout()
                self.horizontalLayout_3.setSizeConstraint(QtWidgets.QLayout.SetNoConstraint)
                self.horizontalLayout_3.setContentsMargins(-1, -1, 0, -1)
                self.horizontalLayout_3.setSpacing(0)
                self.horizontalLayout_3.setObjectName("horizontalLayout_3")
                self.addRow_1 = QtWidgets.QPushButton(self.tab)
                sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Fixed, QtWidgets.QSizePolicy.Fixed)
                sizePolicy.setHorizontalStretch(0)
                sizePolicy.setVerticalStretch(0)
                sizePolicy.setHeightForWidth(self.addRow_1.sizePolicy().hasHeightForWidth())
                self.addRow_1.setSizePolicy(sizePolicy)
                self.addRow_1.setText("")
                icon = QtGui.QIcon()
                icon.addPixmap(QtGui.QPixmap("../+.png"), QtGui.QIcon.Normal, QtGui.QIcon.Off)
                self.addRow_1.setIcon(icon)
                self.addRow_1.setObjectName("addRow_1")
                self.horizontalLayout_3.addWidget(self.addRow_1)
                self.deleteRow_1 = QtWidgets.QPushButton(self.tab)
                sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Fixed, QtWidgets.QSizePolicy.Fixed)
                sizePolicy.setHorizontalStretch(0)
                sizePolicy.setVerticalStretch(0)
                sizePolicy.setHeightForWidth(self.deleteRow_1.sizePolicy().hasHeightForWidth())
                self.deleteRow_1.setSizePolicy(sizePolicy)
                self.deleteRow_1.setMaximumSize(QtCore.QSize(16777215, 16777215))
                self.deleteRow_1.setBaseSize(QtCore.QSize(0, 0))
                self.deleteRow_1.setAcceptDrops(False)
                self.deleteRow_1.setStyleSheet("")
                self.deleteRow_1.setText("")
                icon1 = QtGui.QIcon()
                icon1.addPixmap(QtGui.QPixmap("../-.png"), QtGui.QIcon.Normal, QtGui.QIcon.Off)
                self.deleteRow_1.setIcon(icon1)
                self.deleteRow_1.setIconSize(QtCore.QSize(18, 18))
                self.deleteRow_1.setShortcut("")
                self.deleteRow_1.setCheckable(False)
                self.deleteRow_1.setAutoRepeat(False)
                self.deleteRow_1.setAutoExclusive(False)
                self.deleteRow_1.setAutoDefault(False)
                self.deleteRow_1.setFlat(False)
                self.deleteRow_1.setObjectName("deleteRow_1")
                self.horizontalLayout_3.addWidget(self.deleteRow_1)
                self.verticalLayout_2.addLayout(self.horizontalLayout_3)
                self.DataTable_1 = QtWidgets.QTableWidget(self.tab)
                self.DataTable_1.setEnabled(True)
                self.DataTable_1.setMouseTracking(False)
                self.DataTable_1.setAcceptDrops(False)
                self.DataTable_1.setLayoutDirection(QtCore.Qt.LeftToRight)
                self.DataTable_1.setAutoFillBackground(False)
                self.DataTable_1.setStyleSheet("")
                self.DataTable_1.setSizeAdjustPolicy(QtWidgets.QAbstractScrollArea.AdjustIgnored)
                self.DataTable_1.setDragEnabled(True)
                self.DataTable_1.setDragDropOverwriteMode(True)
                self.DataTable_1.setDragDropMode(QtWidgets.QAbstractItemView.DragOnly)
                self.DataTable_1.setDefaultDropAction(QtCore.Qt.CopyAction)
                self.DataTable_1.setTextElideMode(QtCore.Qt.ElideRight)
                self.DataTable_1.setRowCount(0)
                self.DataTable_1.setColumnCount(5)
                self.DataTable_1.setObjectName("DataTable_1")
                item = QtWidgets.QTableWidgetItem()
                self.DataTable_1.setHorizontalHeaderItem(0, item)
                item = QtWidgets.QTableWidgetItem()
                self.DataTable_1.setHorizontalHeaderItem(1, item)
                item = QtWidgets.QTableWidgetItem()
                self.DataTable_1.setHorizontalHeaderItem(2, item)
                item = QtWidgets.QTableWidgetItem()
                self.DataTable_1.setHorizontalHeaderItem(3, item)
                item = QtWidgets.QTableWidgetItem()
                self.DataTable_1.setHorizontalHeaderItem(4, item)
                self.DataTable_1.horizontalHeader().setVisible(True)
                self.DataTable_1.horizontalHeader().setCascadingSectionResizes(False)
                self.DataTable_1.horizontalHeader().setDefaultSectionSize(160)
                self.DataTable_1.horizontalHeader().setHighlightSections(True)
                self.DataTable_1.horizontalHeader().setMinimumSectionSize(20)
                self.DataTable_1.horizontalHeader().setSortIndicatorShown(False)
                self.DataTable_1.horizontalHeader().setStretchLastSection(True)
                self.DataTable_1.verticalHeader().setVisible(True)
                self.DataTable_1.verticalHeader().setDefaultSectionSize(37)
                self.DataTable_1.verticalHeader().setHighlightSections(True)
                self.DataTable_1.verticalHeader().setMinimumSectionSize(30)
                self.DataTable_1.verticalHeader().setSortIndicatorShown(False)
                self.DataTable_1.verticalHeader().setStretchLastSection(False)
                self.verticalLayout_2.addWidget(self.DataTable_1)
                self.horizontalLayout_2 = QtWidgets.QHBoxLayout()
                self.horizontalLayout_2.setSizeConstraint(QtWidgets.QLayout.SetNoConstraint)
                self.horizontalLayout_2.setContentsMargins(-1, -1, 0, -1)
                self.horizontalLayout_2.setSpacing(0)
                self.horizontalLayout_2.setObjectName("horizontalLayout_2")
                self.addRow_2 = QtWidgets.QPushButton(self.tab)
                sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Fixed, QtWidgets.QSizePolicy.Fixed)
                sizePolicy.setHorizontalStretch(0)
                sizePolicy.setVerticalStretch(0)
                sizePolicy.setHeightForWidth(self.addRow_2.sizePolicy().hasHeightForWidth())
                self.addRow_2.setSizePolicy(sizePolicy)
                self.addRow_2.setText("")
                self.addRow_2.setIcon(icon)
                self.addRow_2.setObjectName("addRow_2")
                self.horizontalLayout_2.addWidget(self.addRow_2)
                self.deleteRow_2 = QtWidgets.QPushButton(self.tab)
                sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Fixed, QtWidgets.QSizePolicy.Fixed)
                sizePolicy.setHorizontalStretch(0)
                sizePolicy.setVerticalStretch(0)
                sizePolicy.setHeightForWidth(self.deleteRow_2.sizePolicy().hasHeightForWidth())
                self.deleteRow_2.setSizePolicy(sizePolicy)
                self.deleteRow_2.setStyleSheet("")
                self.deleteRow_2.setText("")
                self.deleteRow_2.setIcon(icon1)
                self.deleteRow_2.setIconSize(QtCore.QSize(18, 18))
                self.deleteRow_2.setShortcut("")
                self.deleteRow_2.setCheckable(False)
                self.deleteRow_2.setAutoRepeat(False)
                self.deleteRow_2.setAutoExclusive(False)
                self.deleteRow_2.setAutoDefault(False)
                self.deleteRow_2.setFlat(False)
                self.deleteRow_2.setObjectName("deleteRow_2")
                self.horizontalLayout_2.addWidget(self.deleteRow_2)
                self.verticalLayout_2.addLayout(self.horizontalLayout_2)
                self.DataTable_2 = QtWidgets.QTableWidget(self.tab)
                self.DataTable_2.setLayoutDirection(QtCore.Qt.LeftToRight)
                self.DataTable_2.setSizeAdjustPolicy(QtWidgets.QAbstractScrollArea.AdjustIgnored)
                self.DataTable_2.setDragEnabled(True)
                self.DataTable_2.setDragDropOverwriteMode(True)
                self.DataTable_2.setDragDropMode(QtWidgets.QAbstractItemView.DragOnly)
                self.DataTable_2.setDefaultDropAction(QtCore.Qt.CopyAction)
                self.DataTable_2.setObjectName("DataTable_2")
                self.DataTable_2.setColumnCount(5)
                self.DataTable_2.setRowCount(0)
                item = QtWidgets.QTableWidgetItem()
                self.DataTable_2.setHorizontalHeaderItem(0, item)
                item = QtWidgets.QTableWidgetItem()
                self.DataTable_2.setHorizontalHeaderItem(1, item)
                item = QtWidgets.QTableWidgetItem()
                self.DataTable_2.setHorizontalHeaderItem(2, item)
                item = QtWidgets.QTableWidgetItem()
                self.DataTable_2.setHorizontalHeaderItem(3, item)
                item = QtWidgets.QTableWidgetItem()
                self.DataTable_2.setHorizontalHeaderItem(4, item)
                self.DataTable_2.horizontalHeader().setVisible(True)
                self.DataTable_2.horizontalHeader().setCascadingSectionResizes(False)
                self.DataTable_2.horizontalHeader().setDefaultSectionSize(160)
                self.DataTable_2.horizontalHeader().setHighlightSections(True)
                self.DataTable_2.horizontalHeader().setMinimumSectionSize(20)
                self.DataTable_2.horizontalHeader().setSortIndicatorShown(False)
                self.DataTable_2.horizontalHeader().setStretchLastSection(True)
                self.DataTable_2.verticalHeader().setVisible(True)
                self.DataTable_2.verticalHeader().setDefaultSectionSize(37)
                self.DataTable_2.verticalHeader().setHighlightSections(True)
                self.DataTable_2.verticalHeader().setMinimumSectionSize(30)
                self.DataTable_2.verticalHeader().setSortIndicatorShown(False)
                self.DataTable_2.verticalHeader().setStretchLastSection(False)
                self.verticalLayout_2.addWidget(self.DataTable_2)
                self.DataTable_1.raise_()
                self.DataTable_2.raise_()
                self.tabWidget.addTab(self.tab, "")
                self.dfgd = QtWidgets.QWidget()
                self.dfgd.setEnabled(False)
                self.dfgd.setObjectName("dfgd")
                self.tabWidget.addTab(self.dfgd, "")
                self.verticalLayout.addWidget(self.tabWidget)
                MainWindow.setCentralWidget(self.centralwidget)
     
                self.retranslateUi(MainWindow)
                self.tabWidget.setCurrentIndex(0)
                QtCore.QMetaObject.connectSlotsByName(MainWindow)
     
        def retranslateUi(self, MainWindow):
            _translate = QtCore.QCoreApplication.translate
            MainWindow.setWindowTitle(_translate("MainWindow", "123"))
            self.addRow_1.setToolTip(_translate("MainWindow", "<html><head/><body><p>Добавить строку</p></body></html>"))
            self.addRow_1.setWhatsThis(_translate("MainWindow", "<html><head/><body><p><br/></p></body></html>"))
            self.deleteRow_1.setToolTip(_translate("MainWindow", "<html><head/><body><p>Удалить строку</p></body></html>"))
            self.deleteRow_1.setWhatsThis(_translate("MainWindow", "<html><head/><body><p><br/></p></body></html>"))
            self.DataTable_1.setSortingEnabled(False)
            item = self.DataTable_1.horizontalHeaderItem(0)
            item.setText(_translate("MainWindow", "1"))
            item = self.DataTable_1.horizontalHeaderItem(1)
            item.setText(_translate("MainWindow", "2"))
            item = self.DataTable_1.horizontalHeaderItem(2)
            item.setText(_translate("MainWindow", "3"))
            item = self.DataTable_1.horizontalHeaderItem(3)
            item.setText(_translate("MainWindow", "4"))
            item = self.DataTable_1.horizontalHeaderItem(4)
            item.setText(_translate("MainWindow", "5"))
            self.addRow_2.setToolTip(_translate("MainWindow", "<html><head/><body><p>Добавить строку</p></body></html>"))
            self.addRow_2.setWhatsThis(_translate("MainWindow", "<html><head/><body><p><br/></p></body></html>"))
            self.deleteRow_2.setToolTip(_translate("MainWindow", "<html><head/><body><p>Удалить строку</p></body></html>"))
            self.deleteRow_2.setWhatsThis(_translate("MainWindow", "<html><head/><body><p><br/></p></body></html>"))
            item = self.DataTable_2.horizontalHeaderItem(0)
            item.setText(_translate("MainWindow", "1"))
            item = self.DataTable_2.horizontalHeaderItem(1)
            item.setText(_translate("MainWindow", "2"))
            item = self.DataTable_2.horizontalHeaderItem(2)
            item.setText(_translate("MainWindow", "3"))
            item = self.DataTable_2.horizontalHeaderItem(3)
            item.setText(_translate("MainWindow", "4"))
            item = self.DataTable_2.horizontalHeaderItem(4)
            item.setText(_translate("MainWindow", "5"))
            
    
    class ExampleApp(QtWidgets.QMainWindow, Ui_MainWindow):
        def __init__(self):
            super().__init__()
            self.setupUi(self)
            self.deleteRow_1.clicked.connect(self.delete_row_1)
            self.addRow_1.clicked.connect(self.add_row_1)
            self.deleteRow_2.clicked.connect(self.delete_row_2)
            self.addRow_2.clicked.connect(self.add_row_2)
    
    # +++ vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv        
            self.addRow_1.setText("addRow")
            self.deleteRow_1.setText("deleteRow")
            
            self.tw = None
            self.copied_cells = None
            
            self.DataTable_1.cellPressed.connect(
                lambda row, col, tw=self.DataTable_1: self.selection_changed(row, col, tw))
            self.DataTable_2.cellPressed.connect(
                lambda row, col, tw=self.DataTable_2: self.selection_changed(row, col, tw))
            
        def selection_changed(self, row, col, tw):
            self.tw = tw
            #print(f'tw = {tw.objectName()} - {row} - {col}') 
    
        def keyPressEvent(self, event):
            super().keyPressEvent(event)
            if not self.tw:
                return        
            
            if event.key() == QtCore.Qt.Key_C and \
                (event.modifiers() & QtCore.Qt.ControlModifier):
                self.copied_cells = sorted(self.tw.selectedIndexes())
                #print(f'copied_cells = {self.copied_cells}') 
    
            elif event.key() == QtCore.Qt.Key_V and \
                (event.modifiers() & QtCore.Qt.ControlModifier):
                if not self.copied_cells:
                    return               
                #print(f'objectName = {self.tw.objectName()}') 
                
                r = self.tw.currentRow() - self.copied_cells[0].row()
                c = self.tw.currentColumn() - self.copied_cells[0].column()
                #print(f'{r} - {c}') 
                for cell in self.copied_cells:
                    self.tw.setItem(
                        cell.row() + r, \
                        cell.column() + c, \
                        QtWidgets.QTableWidgetItem(cell.data())
                    )
    # +++ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^               
    
        def add_row_1(self):
            row_position = self.DataTable_1.rowCount()
            self.DataTable_1.insertRow(row_position)
    
        def delete_row_1(self):
            rows = set()
            for index in self.DataTable_1.selectedIndexes():
                rows.add(index.row())
            for row in sorted(rows, reverse=True):
                self.DataTable_1.removeRow(row)
    
        def add_row_2(self):
            row_position = self.DataTable_2.rowCount()
            self.DataTable_2.insertRow(row_position)
    
        def delete_row_2(self):
            rows = set()
            for index in self.DataTable_2.selectedIndexes():
                rows.add(index.row())
            for row in sorted(rows, reverse=True):
                self.DataTable_2.removeRow(row)
    
    
    def main():
        app = QtWidgets.QApplication(sys.argv)
        window = ExampleApp()
        window.show()
        app.exec_()
    
    
    if __name__ == '__main__':
        main()
    

    在此处输入图像描述

    在此处输入图像描述

    试试看,如果有问题,写。

    • 0

相关问题

  • 是否可以以某种方式自定义 QTabWidget?

  • telebot.anihelper.ApiException 错误

  • Python。检查一个数字是否是 3 的幂。输出 无

  • 解析多个响应

  • 交换两个数组的元素,以便它们的新内容也反转

Sidebar

Stats

  • 问题 10021
  • Answers 30001
  • 最佳答案 8000
  • 用户 6900
  • 常问
  • 回答
  • Marko Smith

    表格填充不起作用

    • 2 个回答
  • Marko Smith

    提示 50/50,有两个,其中一个是正确的

    • 1 个回答
  • Marko Smith

    在 PyQt5 中停止进程

    • 1 个回答
  • Marko Smith

    我的脚本不工作

    • 1 个回答
  • Marko Smith

    在文本文件中写入和读取列表

    • 2 个回答
  • Marko Smith

    如何像屏幕截图中那样并排排列这些块?

    • 1 个回答
  • Marko Smith

    确定文本文件中每一行的字符数

    • 2 个回答
  • Marko Smith

    将接口对象传递给 JAVA 构造函数

    • 1 个回答
  • Marko Smith

    正确更新数据库中的数据

    • 1 个回答
  • Marko Smith

    Python解析不是css

    • 1 个回答
  • Martin Hope
    Alexandr_TT 2020年新年大赛! 2020-12-20 18:20:21 +0000 UTC
  • Martin Hope
    Alexandr_TT 圣诞树动画 2020-12-23 00:38:08 +0000 UTC
  • Martin Hope
    Air 究竟是什么标识了网站访问者? 2020-11-03 15:49:20 +0000 UTC
  • Martin Hope
    Qwertiy 号码显示 9223372036854775807 2020-07-11 18:16:49 +0000 UTC
  • Martin Hope
    user216109 如何为黑客设下陷阱,或充分击退攻击? 2020-05-10 02:22:52 +0000 UTC
  • Martin Hope
    Qwertiy 并变成3个无穷大 2020-11-06 07:15:57 +0000 UTC
  • Martin Hope
    koks_rs 什么是样板代码? 2020-10-27 15:43:19 +0000 UTC
  • Martin Hope
    Sirop4ik 向 git 提交发布的正确方法是什么? 2020-10-05 00:02:00 +0000 UTC
  • Martin Hope
    faoxis 为什么在这么多示例中函数都称为 foo? 2020-08-15 04:42:49 +0000 UTC
  • Martin Hope
    Pavel Mayorov 如何从事件或回调函数中返回值?或者至少等他们完成。 2020-08-11 16:49:28 +0000 UTC

热门标签

javascript python java php c# c++ html android jquery mysql

Explore

  • 主页
  • 问题
    • 热门问题
    • 最新问题
  • 标签
  • 帮助

Footer

RError.com

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

帮助

© 2023 RError.com All Rights Reserve   沪ICP备12040472号-5