我正在对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);
}
答案 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框架,我不建议这样做),您必须考虑另一种方式。