如何使用键盘使QTableWidget响应功能



我正在创建一个接口,该接口试图在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((类中,显然复制和粘贴同一小部件的元素的方法不起的作用

说明:

问题是,在工具栏中,您有一个使用Ctrl+C的Q操作,它会消耗该事件,因此它不会传播到其他小部件。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_())

最新更新