子类QCompleter,我的子类中的虚拟槽未被调用

时间:2011-08-15 21:36:16

标签: c++ qt

我正在对QCompleter进行子类化以赋予它一些特殊功能。我希望在模型中只有一个带有给定前缀的完成时触发activate(),但这不是我遇到问题的地方。

我在我的子类中创建了一个虚拟的setCompleterPrefix(),但编译器似乎没有注意到它。而是在用户输入前缀时调用基本QCompleter :: setCompletionPrefix()。我做错了吗?

这是我的班级:

#ifndef INSTANTCOMPLETER_H
#define INSTANTCOMPLETER_H

#include <QCompleter>

namespace Reliant
{
class InstantCompleter : public QCompleter
{
    Q_OBJECT
public:
    explicit InstantCompleter(QObject* parent = 0);

private:

signals:

public slots:
    virtual void setCompletionPrefix(const QString &prefix);

};
}

#endif // INSTANTCOMPLETER_H

定义:

#include "instantcompleter.h"
using Reliant::InstantCompleter;

InstantCompleter::InstantCompleter(QObject* parent) :
    QCompleter(parent)
{
}

void InstantCompleter::setCompletionPrefix(const QString &prefix)
{
    int completionCount = this->completionCount();
    if(completionCount == 1 && setCurrentRow(0))
        emit activated(currentCompletion());
    else
        QCompleter::setCompletionPrefix(prefix);
}

3 个答案:

答案 0 :(得分:1)

根据这个“这个方法也是一个带有C ++签名void setCompletionPrefix(const QString&)的Qt插槽。”来自http://www.riverbankcomputing.co.uk/static/Docs/PyQt4/html/qcompleter.html#setCompletionPrefix该函数不是虚拟的,因此无法覆盖。我怀疑有一个替代接口可以覆盖该功能。

答案 1 :(得分:1)

您可以使用QCompleter :: completionModel()返回的模型及其信号来跟踪完成次数:

InstantCompleter::InstantCompleter(QObject* parent) :
    QCompleter(parent)
{
    connect(completionModel(), SIGNAL(layoutChanged()), SLOT(completionModelChanged()));
}

// declared in the "private slots:" section
void InstantCompleter::completionModelChanged()
{
    if (completionCount() == 1 && setCurrentRow(0))
        emit activated(currentCompletion());
}

答案 2 :(得分:1)

为了覆盖C ++中的方法,基类必须将其定义为虚拟。将虚拟添加到子类中的方法不会更改此行为。

同样,没有办法覆盖该方法(除非您拥有商业许可并根据您的需要更改Qt框架,我不建议这样做),您必须考虑另一种方式。