Qt:在LineEdit小部件上显示映射到AbstractListModel的工具提示

时间:2017-05-23 18:22:48

标签: python qt tooltip pyqt5

情况

以下是一个Qt示例,其中包含AbstractListModel和两个与此模型相关联的显示小部件(ListViewLineEdit):

from PyQt5 import QtCore, QtWidgets

class ListModel(QtCore.QAbstractListModel):
    def __init__(self, data_values, tooltips, parent=None):
        super().__init__(parent)
        self.data_values = data_values
        self.tooltips = tooltips


    def rowCount(self, parent=QtCore.QModelIndex()):
        return len(self.data_values)


    def data(self, index, role=QtCore.Qt.DisplayRole):
        if (role == QtCore.Qt.DisplayRole or role == QtCore.Qt.EditRole):
            return self.data_values[index.row()]
        elif role == QtCore.Qt.ToolTipRole:
            return self.tooltips[index.row()]


class Window(QtWidgets.QWidget):
    def __init__(self):
        super().__init__()

        data_values = ['apple', 'pumpkin', 'orange']
        tooltips = [
            "Don't accept when offered by evil queen in disguise.",
            "Excellent halloween decoration.",
            "Good source of Vitamin C.",
        ]
        self.list_model = ListModel(data_values, tooltips)

        self.line_edit = QtWidgets.QLineEdit(parent=self)
        self.line_edit.setReadOnly(True)

        self.list_view = QtWidgets.QListView(parent=self)
        self.list_view.setModel(self.list_model)
        self.list_view.setCurrentIndex(self.list_model.index(0))

        self.mapper = QtWidgets.QDataWidgetMapper(parent=self)
        self.mapper.setModel(self.list_model)
        self.mapper.addMapping(self.line_edit, 0)
        self.mapper.toFirst()

        self.list_view.selectionModel().currentRowChanged.connect(self.mapper.setCurrentModelIndex)

        layout = QtWidgets.QVBoxLayout()
        layout.addWidget(self.list_view, 0)
        layout.insertSpacing(1, 40)
        layout.addWidget(self.line_edit, 2)
        self.setLayout(layout)


qt_application = QtWidgets.QApplication([])
window = Window()
window.show()
qt_application.exec_()

我已配置data的{​​{1}}方法,以便为链接的小部件提供工具提示文本。当鼠标光标放在AbstractListModel中的项目上时,确实会出现工具提示。但是,当鼠标光标放在ListView上时,不会显示工具提示。

enter image description here

问题

我希望LineEdit显示工具提示,其中包含链接的LineEdit提供的文字。有没有办法实现这一目标?

1 个答案:

答案 0 :(得分:2)

使用QDataWidgetMapper无法实现此目的。 QDataWidgetMapper始终使用模型的Qt::EditRole值。可以建议使用重载版本的addMappingTableModel一列(section)进行显示,一个用于工具提示,但这是不可能的,因为{{1} }只允许您实现one-to-one mapping

  

如果窗口小部件已映射到某个部分,则旧映射将为   取而代之的是新的。

<强>解决方案

最简单的解决方案是自己创建一个插槽,连接到QDataWidgetMapper信号,并手动设置工具提示(QWidget::setToolTip)和文字(QLineEdit::setText)。