как заставить QTableWidget реагировать на функции с клавиатуры - PullRequest
1 голос
/ 13 июля 2020

Я создаю интерфейс, который пытается записать несколько данных в QtableWidget, но он является интерактивным, например, копировать и вставлять с помощью команд клавиатуры. Моя проблема связана с файлом ini.py . Если действие копирования и вставки не работает

untitled_ui.py

from PyQt5 import QtCore, QtGui, QtWidgets


class Ui_MainWindow(object):
    def setupUi(self, MainWindow):
        MainWindow.setObjectName("MainWindow")
        MainWindow.resize(616, 329)
        self.centralwidget = QtWidgets.QWidget(MainWindow)
        self.centralwidget.setObjectName("centralwidget")
        self.horizontalLayout = QtWidgets.QHBoxLayout(self.centralwidget)
        self.horizontalLayout.setObjectName("horizontalLayout")
        self.tabWidget = QtWidgets.QTabWidget(self.centralwidget)
        self.tabWidget.setObjectName("tabWidget")
        self.horizontalLayout.addWidget(self.tabWidget)
        MainWindow.setCentralWidget(self.centralwidget)
        self.menubar = QtWidgets.QMenuBar(MainWindow)
        self.menubar.setGeometry(QtCore.QRect(0, 0, 616, 21))
        self.menubar.setObjectName("menubar")
        self.menuNew = QtWidgets.QMenu(self.menubar)
        self.menuNew.setObjectName("menuNew")
        MainWindow.setMenuBar(self.menubar)
        self.statusbar = QtWidgets.QStatusBar(MainWindow)
        self.statusbar.setObjectName("statusbar")
        MainWindow.setStatusBar(self.statusbar)
        self.toolBar = QtWidgets.QToolBar(MainWindow)
        self.toolBar.setObjectName("toolBar")
        MainWindow.addToolBar(QtCore.Qt.TopToolBarArea, self.toolBar)
        self.actionopen = QtWidgets.QAction(MainWindow)
        self.actionopen.setObjectName("actionopen")
        self.actioncopy = QtWidgets.QAction(MainWindow)
        self.actioncopy.setObjectName("actioncopy")
        self.actionpaste = QtWidgets.QAction(MainWindow)
        self.actionpaste.setObjectName("actionpaste")
        self.actionnew_sheet = QtWidgets.QAction(MainWindow)
        self.actionnew_sheet.setObjectName("actionnew_sheet")
        self.menuNew.addAction(self.actionnew_sheet)
        self.menubar.addAction(self.menuNew.menuAction())
        self.toolBar.addAction(self.actionopen)
        self.toolBar.addAction(self.actioncopy)
        self.toolBar.addAction(self.actionpaste)

        self.retranslateUi(MainWindow)
        QtCore.QMetaObject.connectSlotsByName(MainWindow)

    def retranslateUi(self, MainWindow):
        _translate = QtCore.QCoreApplication.translate
        MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow"))
        self.menuNew.setTitle(_translate("MainWindow", "New"))
        self.toolBar.setWindowTitle(_translate("MainWindow", "toolBar"))
        self.actionopen.setText(_translate("MainWindow", "open"))
        self.actionopen.setShortcut(_translate("MainWindow", "Ctrl+O"))
        self.actioncopy.setText(_translate("MainWindow", "copy"))
        self.actioncopy.setShortcut(_translate("MainWindow", "Ctrl+C"))
        self.actionpaste.setText(_translate("MainWindow", "paste"))
        self.actionpaste.setShortcut(_translate("MainWindow", "Ctrl+V"))
        self.actionnew_sheet.setText(_translate("MainWindow", "new sheet"))

ini .py

import sys
from PyQt5.QtCore import Qt
from PyQt5.QtWidgets import QMainWindow, QApplication, QFileDialog, QTableWidget, QTableWidgetItem, QFrame
import untitled_ui


class Table(QTableWidget):

    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        self.setFrameShape(QFrame.StyledPanel)
        self.setFrameShadow(QFrame.Sunken)
        self.setAlternatingRowColors(True)
        self.setGridStyle(Qt.CustomDashLine)
        self.setRowCount(10)
        self.setColumnCount(10)

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


class Ui_MainWindow(QMainWindow, untitled_ui.Ui_MainWindow):
    def __init__(self):
        QMainWindow.__init__(self)
        self.setupUi(self)

        self.actionnew_sheet.triggered.connect(self.on_new)

    def on_new(self):
        self.table = Table()
        self.tabWidget.addTab(self.table, "* New Table *")

if __name__ == '__main__':
    app = QApplication(sys.argv)
    frame = Ui_MainWindow()
    frame.show()
    sys.exit(app.exec_())

моя проблема в классе Table () , по-видимому, метод копирования и вставки элементов одного и того же виджета не работает

1 Ответ

1 голос
/ 13 июля 2020

Объяснение:

Проблема в том, что на панели инструментов у вас есть QAction с сокращением Ctrl + C, которое потребляет это событие, поэтому оно не будет распространяются на другие виджеты. То же самое происходит с Ctrl + V .

Решение:

Возможное решение - использовать это QAction

import sys
from PyQt5.QtCore import Qt
from PyQt5.QtWidgets import (
    QMainWindow,
    QApplication,
    QTableWidget,
    QTableWidgetItem,
    QFrame,
)
import untitled_ui


class Table(QTableWidget):
    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        self.setFrameShape(QFrame.StyledPanel)
        self.setFrameShadow(QFrame.Sunken)
        self.setAlternatingRowColors(True)
        self.setGridStyle(Qt.CustomDashLine)
        self.setRowCount(10)
        self.setColumnCount(10)

    def copy(self):
        self.copied_cells = sorted(self.selectedIndexes())
        print("pressed Ctrl+C")

    def paste(self):
        if self.copied_cells:
            r = self.currentRow() - self.copied_cells[0].row()
            c = self.currentColumn() - self.copied_cells[0].column()
            print("pressed Ctrl+V")
            print(r)
            for cell in self.copied_cells:
                self.setItem(
                    cell.row() + r, cell.column() + c, QTableWidgetItem(cell.data())
                )


class Ui_MainWindow(QMainWindow, untitled_ui.Ui_MainWindow):
    def __init__(self):
        QMainWindow.__init__(self)
        self.setupUi(self)

        self.actionnew_sheet.triggered.connect(self.on_new)
        self.actioncopy.triggered.connect(self.copy)
        self.actionpaste.triggered.connect(self.paste)

    def on_new(self):
        table = Table()
        self.tabWidget.addTab(table, "* New Table *")

    def copy(self):
        w = self.tabWidget.currentWidget()
        if hasattr(w, "copy") and callable(w.copy):
            w.copy()

    def paste(self):
        w = self.tabWidget.currentWidget()
        if hasattr(w, "paste") and callable(w.paste):
            w.paste()


if __name__ == "__main__":
    app = QApplication(sys.argv)
    frame = Ui_MainWindow()
    frame.show()
    sys.exit(app.exec_())
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...