qt - 如何为当前项目制作 QCombobox 绘画项目委托(delegate)? (Qt 4)

标签 qt qt4 qcombobox qitemdelegate

QCombobox 设置项目委托(delegate)不为当前项目绘制..

我正在尝试创建一个组合框,显示不同的线类型(实线、虚线、虚线等)。目前我正在为其内容设置项目委托(delegate)
以便绘制/绘制线型而不是显示名称。所有线型都在正确绘制,但只要我从
组合框,组合框的当前索引只显示行名而不是​​绘制它。我怎样才能让它在当前绘制选定的线型
组合框索引?

最佳答案

委托(delegate)在组合弹出窗口中绘制项目:

class LineStyleDelegate(QtGui.QItemDelegate):

    def __init__(self, object, parent = None):
        QtGui.QItemDelegate.__init__(self, parent)

    def paint(self, painter, option, index):
        data = index.model().data(index, QtCore.Qt.UserRole)
        if data.isValid() and data.toPyObject() is not None:
            data = data.toPyObject()
            painter.save()

            rect = option.rect
            rect.adjust(+5, 0, -5, 0)

            pen = QtGui.QPen()
            pen.setColor(QtCore.Qt.black)
            pen.setWidth(3)
            pen.setStyle(data)
            painter.setPen(pen)

            middle = (rect.bottom() + rect.top()) / 2

            painter.drawLine(rect.left(), middle, rect.right(), middle)
            painter.restore()

        else:
            QtGui.QItemDelegate.paint(self, painter, option, index)

        painter.drawLine(rect.left(), middle, rect.right(), middle)
        painter.restore()

    else:
        QtGui.QItemDelegate.paint(self, painter, option, index)

paintEvent 以组合方式绘制当前项目。当然,您可以手动绘制它,但是有一种简单的方法可以绘制组合框控件本身(如果您想要当前的箭头按钮或 smth):
def paintEvent(self, e):
    data = self.itemData(self.currentIndex(), QtCore.Qt.UserRole)
    if data.isValid() and data.toPyObject() is not None:
        data = data.toPyObject()
        p = QtGui.QStylePainter(self)
        p.setPen(self.palette().color(QtGui.QPalette.Text))

        opt = QtGui.QStyleOptionComboBox()
        self.initStyleOption(opt)
        p.drawComplexControl(QtGui.QStyle.CC_ComboBox, opt)

        painter = QtGui.QPainter(self)
        painter.save()

        rect = p.style().subElementRect(QtGui.QStyle.SE_ComboBoxFocusRect, opt, self)
        rect.adjust(+5, 0, -5, 0)

        pen = QtGui.QPen()
        pen.setColor(QtCore.Qt.black)
        pen.setWidth(3)
        pen.setStyle(data)
        painter.setPen(pen)

        middle = (rect.bottom() + rect.top()) / 2

        painter.drawLine(rect.left(), middle, rect.right(), middle)
        painter.restore()

    else:
        QtGui.QComboBox.paintEvent(self, e)

关于qt - 如何为当前项目制作 QCombobox 绘画项目委托(delegate)? (Qt 4),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/516032/

相关文章:

c++ - 如何在不阻塞的情况下启动Qt事件进程?

c++ - QComboBox:仅在展开时显示图标

python - 使用 PyQt 的组合框中的复选框

c++ - 如何在 Qt 中的后续函数调用中访问在函数内创建的小部件

c++ - 删除 QTableWidget 中的行填充?

c++ - Q_IMPORT_PLUGIN,我可以使用多少次?

c++ - QListview, QTreeview 是正确的以列表方式显示文件

qt4 - page-break-inside 在具有 rowSpan 的表格单元格中不起作用?

c++ - MFC 到 QT 的转换

qt - QComboBox AbstractItemView::item