3

に設定されている と がありQCompleterます。に設定されているアイテム間のセパレーターとして線を引くにはどうすればよいですか。最後に、に設定されます。QStringListModelQCompleterStringListQStringListModelQCompleterQLineEdit

ここに画像の説明を入力

4

2 に答える 2

0

OK、それで十分だと思ったので、最初のヒントよりも詳細を提供しようとしています。人々がさらに質問し始めるのではないかと心配しているので、以下に示します。

completeseparatordelegate.h

#include <QItemDelegate>
#include <QSize>
#include <QModelIndex>
#include <QStyleOptionViewItem>

class CompleterSeparatorDelegate : public QItemDelegate
{
    Q_OBJECT

public:
    CompleterSeparatorDelegate(QObject *parent = 0);
    ~CompleterSeparatorDelegate();

protected:    
    void paint(QPainter *painter, const QStyleOptionViewItem &option,
               const QModelIndex &index) const;
    QSize sizeHint(const QStyleOptionViewItem &option,
                   const QModelIndex &index) const;
};

completeseparatordelegate.cpp

#include "completerseparatordelegate.h"

#include <QPainter>
#include <QString>

CompleterSeparatorDelegate::CompleterSeparatorDelegate(QObject *parent)
    : QItemDelegate(parent)
{
}

CompleterSeparatorDelegate::~CompleterSeparatorDelegate()
{
}

void CompleterSeparatorDelegate::paint(QPainter *painter,
                          const QStyleOptionViewItem &option,
                          const QModelIndex &index) const
{
    if(index.data(Qt::AccessibleDescriptionRole).toString() == QLatin1String("separator"))
    {
        painter->setPen(Qt::red);
        painter->drawLine(option.rect.left(), option.rect.center().y(), option.rect.right(), option.rect.center().y());
    } else {
        QItemDelegate::paint(painter, option, index);
    }
}

QSize CompleterSeparatorDelegate::sizeHint(const QStyleOptionViewItem &option,
                                           const QModelIndex &index) const
{
    QString type = index.data(Qt::AccessibleDescriptionRole).toString();
    if(type == QLatin1String("separator"))
        return QSize(0, 2);
    return QItemDelegate::sizeHint( option, index );
}

メインウィンドウ.cpp

#include "completerseparatordelegate.h"

...
listView->setItemDelegate(new CompleterSeparatorDelegate);
completer->setPopup(listView);
...

私は生のテキストとしてオンザフライで書いているだけなので、このコードをコンパイルしようとはしていませんが、主なアイデアは基本的にここからわずかな調整を加えたものです。

于 2013-12-29T11:43:28.957 に答える
0

デリゲート ペイントでウィジェットの新しいタイプとカスタム デリゲートを使用してカスタム モデルを作成します。新しいタイプで任意のものをペイントし、デフォルト タイプが親でペイントできるようにします... コンボボックスのこの例を参照してください

于 2013-12-29T05:39:39.947 に答える