Копирование текста не работает одинаково для каждого виджета, потому что каждый тип виджета использует даже радикально разные способы отображения или взаимодействия с текстом.
Если вы хотите скопировать текст QLabel, вы должны сделать его выбираемым (используя label.setTextInteractionFlags(Qt.TextSelectableByMouse)
).
Но если вы хотите скопировать текст из QTableWidget, все будет по-другому, так как таблица позволяет взаимодействовать с их элементами которые препятствуют простому выделению текста.
Очевидно, что наиболее простым способом было бы начать редактирование элемента (при условии, что он редактируемый) и выбрать его текст, но если вам нужны другие способы сделать это, это зависит от как вы хотите иметь возможность копировать текст.
Возможно использование сочетания клавиш ctrl + c. Для этого нам нужно установить фильтр событий на виджет таблицы:
from PyQt5 import QtCore, QtGui, QtWidgets
from mainwindow import Ui_MainWindow
class MainWindow(QtWidgets.QMainWindow, Ui_MainWindow):
def __init__(self):
super().__init__()
self.setupUi(self)
# install an event filter on the table widget, so that we can filter all
# its event, including keyboard presses
self.tableWidget.installEventFilter(self)
def eventFilter(self, source, event):
if event.type() == QtCore.QEvent.KeyPress and event == QtGui.QKeySequence.Copy:
# check if an index is currently selected and it has text
text = self.tableWidget.currentIndex().data()
if text:
# copy that text to the clipboard
QtWidgets.QApplication.clipboard().setText(text)
return super().eventFilter(source, event)
if __name__ == '__main__':
import sys
app = QtWidgets.QApplication(sys.argv)
w = MainWindow()
w.show()
sys.exit(app.exec_())
Обратите внимание, что в примере выше я использовал метод множественного наследования, описанный в документации о с использованием Designer с пользовательскими файлами. Вы должны никогда редактировать файлы, созданные с помощью pyuic
.
Также можно установить меню для виджета таблицы и скопировать оттуда текст:
class MainWindow(QtWidgets.QMainWindow, Ui_MainWindow):
def __init__(self):
# ...
# use the custom context menu policy for the table widget, so that we can
# connect the menu request to a slot
self.tableWidget.setContextMenuPolicy(QtCore.Qt.CustomContextMenu)
self.tableWidget.customContextMenuRequested.connect(self.showTableMenu)
def showTableMenu(self, pos):
# get the text of the index at the mouse cursor (if any)
text = self.tableWidget.indexAt(pos).data()
menu = QtWidgets.QMenu()
copyAction = menu.addAction('Copy')
if not text:
copyAction.setEnabled(False)
# show the menu
res = menu.exec_(QtGui.QCursor.pos())
if res == copyAction:
# if the menu has been triggered by the action, copy to the clipboard
QtWidgets.QApplication.clipboard().setText(text)