Как нарисовать линию между элементами QCompleter в качестве разделителя?

У меня есть QCompleter и QStringListModel, который установлен в QCompleter. Теперь, как я могу нарисовать линию в качестве разделителя между элементами StringList, который установлен в QStringListModel. Наконец, QCompleter будет установлен в QLineEdit.
введите описание изображения здесь

3

Решение

Создайте настраиваемую модель с новым типом и настраиваемым делегатом для вашего виджета в Paint делегата, вы можете нарисовать любую вещь в вашем новом типе и позволить типу по умолчанию рисовать в родительском …
см этот пример для combobox

0

Другие решения

Итак, я пытаюсь предоставить больше деталей, чем в моем первоначальном указании, так как я думал, что этого будет достаточно. Я боюсь, что люди начнут спрашивать дальше, вот так:

completerseparatordelegate.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;
};

completerseparatordelegate.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 );
}

mainwindow.cpp

#include "completerseparatordelegate.h"
...
listView->setItemDelegate(new CompleterSeparatorDelegate);
completer->setPopup(listView);
...

Я не пытался скомпилировать этот код, так как просто пишу его на лету как необработанный текст, но основная идея в основном исходит от Вот с незначительной адаптацией.

0

По вопросам рекламы [email protected]