скопировать вставить текст в метку в ячейке QTableWidget PyQt5 - PullRequest
1 голос
/ 03 августа 2020

У меня в приложении несколько QTableWidget:

Окно моего приложения

Я хочу иметь возможность копировать текст, хранящийся в ячейке, при выборе, нажав ctrl + c или щелкнув правой кнопкой мыши и выбрав меню «Копировать».

Таблицы, которые я использую, согласованы, и это код, который реализует em:

class AlphaPiQTableWidget(QTableWidget):
    def __init__(self, attr_dict):
        super(AlphaPiQTableWidget, self).__init__()
        values = list(attr_dict.values())
        attributes = list(attr_dict.keys())

        # Tabella che mostra i valori del competitor
        self.setRowCount(len(attributes))
        self.setColumnCount(2)
        self.setCellWidget(0,0, QLabel(attributes[0]))
        self.setCellWidget(1,0, QLabel(attributes[1]))
        self.setCellWidget(2,0, QLabel(attributes[2]))
        self.setCellWidget(3,0, QLabel(attributes[3]))
        self.setCellWidget(0,1, QLabel(str(values[0])))
        self.setCellWidget(1,1, QLabel(str(values[1])))
        self.setCellWidget(2,1, QLabel(str(values[2])))
        self.setCellWidget(3,1, QLabel(str(values[3])))

        self.setContextMenuPolicy(QtCore.Qt.CustomContextMenu)
        self.customContextMenuRequested.connect(self.showTableMenu)

        # Fai occupare tutto lo spazio libero nel layout alla tabella
        h_header = self.horizontalHeader()       
        h_header.setSectionResizeMode(QtWidgets.QHeaderView.Stretch)
        h_header.setVisible(False)
        
        v_header = self.verticalHeader()       
        v_header.setSectionResizeMode(QtWidgets.QHeaderView.Stretch)
        v_header.setVisible(False)

        # Fai in modo che la tabella sia sempre visualizzata per intero
        self.setVerticalScrollBarPolicy(Qt.ScrollBarAlwaysOff)
        self.setHorizontalScrollBarPolicy(Qt.ScrollBarAlwaysOff)

    def showTableMenu(self, pos):
        # get the text of the index at the mouse cursor (if any)
        text = self.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)

Проблема в том, что когда я копирую текст, щелкая правой кнопкой мыши по ячейке и нажимая «копировать» 'self.indexAt(pos).data() всегда возвращает None. Почему?

PS все AlphaPiQTableWidget хранятся в QHBoxLayout вместе с другими виджетами (такими как ярлыки и кнопки, как вы можете видеть.

1 Ответ

2 голосов
/ 03 августа 2020

То, что есть ячейки, не означает, что есть элементы, в вашем случае вы разместили виджеты поверх ячеек, поэтому на самом деле вы хотите получить текст этих QLabel.

Первое, что нужно сделать - получить QLabel с помощью метода cellWidget, но для этого необходимо получить строку и столбец нажатой ячейки, и в этом случае необходимо использовать метод indexAt ():

def showTableMenu(self, pos):
    index = self.indexAt(pos)
    label = self.cellWidget(index.row(), index.column())
    text = label.text()
    # ...

Другое решение не использовать QLabels, а скорее QTableWidgetItem:

self.<b>setItem(0,0, QTableWidgetItem</b>(attributes[0]))
# ...
...