2011-08-15 8 views
1

QCompleterをサブクラス化して、いくつかの特別な機能を追加します。私は与えられた接頭辞を持つモデルに完了が1つしかないときにactivated()を起動させたいが、それは問題がある場所ではない。サブクラスQCompleter、サブクラスの仮想スロットが呼び出されていない

私はサブクラスで仮想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); 
} 

答えて

1

あなたはQCompleterによって返されたモデルを使用することができます:: completionModel()と完了数を追跡するためにその信号:C++でのメソッドをオーバーライドするために

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

これによると、 "この方法はまた、C++の署名void setCompletionPrefix(const QString&)とQtのスロットです。" http://www.riverbankcomputing.co.uk/static/Docs/PyQt4/html/qcompleter.html#setCompletionPrefixから関数は仮想ではないため、上書きすることはできません。私はその能力をオーバーライドする代わりのインターフェイスがあると思う。

+1

+1 http://doc.qt.nokia.com/latest/qcompleter.htmlでは、setCompletionPrefixも仮想として表示されません。 –

1

を、基底クラスは、仮想としてそれを定義する必要があります。サブクラスのメソッドに仮想を追加しても、この動作は変更されません。

同様に、商用ライセンスを持っておらず、あなたのニーズに合わせてQtフレームワークを変更して、別の方法を考えなければ、その方法を無効にする方法はありません。

関連する問題