Mads M Pedersen
Mads M Pedersen

Reputation: 613

Different tooltips at each header in QTableView

I can add a single tooltip to all headers using

tableview = QTableView()
tableview.horizontalHeader().setToolTip("headers")

but can I add different tooltips to each header, i.e. I need to access the QWidgets that contains the headers, e.g. (not working):

tableview.horizontalHeader().Item[0].setToolTip("header 0")

Upvotes: 5

Views: 6500

Answers (4)

Brent Forrest
Brent Forrest

Reputation: 21

Here's what worked for me:

    headerView = self._table.horizontalHeader()
    for i in range(headerView.count()):
        key = headerView.model().headerData(i, QtCore.Qt.Horizontal)
        toolTip = myDictOfToolTips.get(key, None)
        self._table.horizontalHeaderItem(i).setToolTip(toolTip)

Upvotes: 2

Тарик Ялауи
Тарик Ялауи

Reputation: 49

If you use QTableView, you can set tooltip by QStandardItemModel:

QStandardItemModel myModel;
myModel.horizontalHeaderItem(1)->setToolTip("");

Upvotes: 0

freakinhippie
freakinhippie

Reputation: 91

I'm pretty new to this stuff too, but I think you'll need to subclass QTableView and reimplement the headerData function. Here is a working example. Hopefully you can extract what you need from it:

from PyQt4 import QtGui, QtCore
import sys

class PaletteListModel(QtCore.QAbstractListModel):

    def __init__(self, colors = [], parent = None):
        QtCore.QAbstractListModel.__init__(self,parent)
        self.__colors = colors

    # required method for Model class
    def rowCount(self, parent):
        return len(self.__colors)

    # optional method for Model class
    def headerData(self, section, orientation, role):
        if role == QtCore.Qt.DisplayRole:
            if orientation == QtCore.Qt.Horizontal:
                return QtCore.QString("Palette")
            else:
                return QtCore.QString("Color %1").arg(section)

        if role == QtCore.Qt.ToolTipRole:
            if orientation == QtCore.Qt.Horizontal:
                return QtCore.QString("Horizontal Header %s Tooltip" % str(section))
            else:
                return QtCore.QString("Vertical Header %s Tooltip" % str(section))


    # required method for Model class
    def data(self, index, role):
        # index contains a QIndexClass object. The object has the following
        # methods: row(), column(), parent()

        row = index.row()
        value = self.__colors[row]

        # keep the existing value in the edit box
        if role == QtCore.Qt.EditRole:
            return self.__colors[row].name()

        # add a tooltip
        if role == QtCore.Qt.ToolTipRole:
            return "Hex code: " + value.name()

        if role == QtCore.Qt.DecorationRole:
            pixmap = QtGui.QPixmap(26,26)
            pixmap.fill(value)

            icon = QtGui.QIcon(pixmap)

            return icon

        if role == QtCore.Qt.DisplayRole:

            return value.name()

    def setData(self, index, value, role = QtCore.Qt.EditRole):
        row = index.row()

        if role == QtCore.Qt.EditRole:
            color = QtGui.QColor(value)

            if color.isValid():
                self.__colors[row] = color
                self.dataChanged.emit(index, index)
                return True

        return False

    # implment flags() method
    def flags(self, index):
        return QtCore.Qt.ItemIsEditable | QtCore.Qt.ItemIsEnabled | QtCore.Qt.ItemIsSelectable

if __name__ == '__main__':

    app = QtGui.QApplication(sys.argv)
    app.setStyle("plastique")

    data = QtCore.QStringList()
    data << "one" << "two" << "three" << "four" << "five"

    tableView = QtGui.QTableView()
    tableView.show()

    red   = QtGui.QColor(255,0,0)
    green = QtGui.QColor(0,255,0)
    blue  = QtGui.QColor(0,0,255)

    model = PaletteListModel([red, green, blue])

    tableView.setModel(model)

    sys.exit(app.exec_())

Upvotes: 6

mata
mata

Reputation: 69042

QTableWidget (which inherits QTableView) has a method horizontalHeaderItem(int) which can be used to get the header items, so you maybe could swich to use that instead of QTableView?

Upvotes: 0

Related Questions