2011-08-15 24 views
1

我對QCompleter進行了子分類,給它一些特殊的功能。我希望激活()被激發時,只有一個模型完成與給定的前綴,但這不是我有問題。子類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 

定義: 「這種方法也是一個Qt的插槽與C++簽名void setCompletionPrefix(const QString&)

#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()和它的信號返回的模型來跟蹤完成計數:

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++中的方法,所述基類必須將其定義爲虛擬。將虛擬添加到子類中的方法不會改變這種行爲。

同樣,沒有辦法重寫這個方法(除非你有一個商業許可證,並根據你的需要更改Qt框架,我不會推薦),你必須想辦法。

相關問題