4

QCombobox set Itemデリゲートが現在のアイテムを描画していません..

さまざまな線種 (実線、点線、破線など) を表示するコンボ ボックスを作成しようとしています。現在、名前を表示する代わりに線種を描画/ペイントするように、コンテンツのアイテム デリゲートを設定しています。すべての線種は正しく描画されていますが、コンボボックスから線種を選択するとすぐに、コンボボックスの現在のインデックスには線名だけが表示され、描画されません。選択した線種を現在のコンボ ボックスのインデックスに描画するにはどうすればよいですか?

4

4 に答える 4

3

コンボ ポップアップでアイテムを描画するデリゲート:

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)
于 2010-03-18T09:26:32.640 に答える
0

ドロップダウンメニューには行を正しく表示しますが、コンボボックス自体には表示しないデリゲートがあるため、以前にこの問題が発生したと思います。

ドキュメント(http://doc.trolltech.com/4.4/qcombobox.html)には次のように記載されています。

「コンボボックスラベルのテキストとアイコンには、Qt::DisplayRoleとQt::DecorationRoleを持つモデルのデータが使用されます。」

デコレーションロールに適したデータを返すモデルを使用するアプローチは機能する可能性がありますが、希望どおりに動作させるのは問題がある可能性があります。

于 2009-02-26T23:15:20.747 に答える
0

画像をアイコンに保存し、QComboBox :: setIconSize()を使用してスケーリングを回避することもできます。

于 2009-03-13T19:26:54.807 に答える
-1

paintEvent をオーバーライドするだけです。ここにいくつかのスケッチコードがあります:

void PenComboBox::paintEvent( QPaintEvent* pEvent)
{
  QComboBox::paintEvent( pEvent);
  QVariant itemData = this->itemData( this->currentIndex(), Qt::DisplayRole);
  if( !itemData.isNull() && qVariantCanConvert<QPen>( itemData))
  {
    QPainter painter(this);
    // .. etc
  }
}
于 2009-05-07T21:09:44.783 に答える