【问题标题】:how to draw a line between items of a QCompleter as a separator?如何在 QCompleter 的项目之间画一条线作为分隔符?
【发布时间】:2013-12-28 13:40:22
【问题描述】:

我有一个QCompleter 和一个设置为QCompleterQStringListModel。现在如何在设置为QStringListModelStringList 项目之间画一条线作为分隔符。最后,QCompleter 将设置为 QLineEdit

【问题讨论】:

标签: c++ qt qtgui qlineedit qcompleter


【解决方案1】:

在委托绘制中为您的小部件创建一个具有新类型的自定义模型和一个自定义委托,您可以在新类型中绘制任何东西并允许默认类型在父级中绘制... see this example for combobox

【讨论】:

    【解决方案2】:

    好的,所以我试图提供比我最初的提示更多的细节,因为我认为这已经足够了。我担心人们会开始进一步询问,所以就这样吧:

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

    主窗口.cpp

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

    我没有尝试编译此代码,因为我只是将其作为原始文本即时编写,但主要思想基本上来自here,稍作修改。

    【讨论】:

    • 你说的是对的,但是你看,使用了一个名为“insertSeparator”的函数,我不能使用它,因为我没有QCombobox。使用QStringListModel画线应该怎么做
    猜你喜欢
    • 1970-01-01
    • 2017-06-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-01
    • 2016-03-09
    • 1970-01-01
    相关资源
    最近更新 更多