2011-08-15 3 views
1

QCompleter를 하위 클래스로 분류하여 일부 특수 기능을 제공합니다. 주어진 접두사가있는 모델에 단 하나의 완성이있을 때 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 

정의 : : 여기

내 클래스입니다. "이 방법은 또한 C++ 서명 void setCompletionPrefix(const QString&)와 Qt는 슬롯은"이에 따라

#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++의 메소드를 오버라이드 (override)하기 위해
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

, 기본 클래스는 가상으로 정의해야합니다 . 하위 클래스의 메서드에 가상을 추가해도이 동작은 변경되지 않습니다.

마찬가지로 상업용 라이센스가없고 내가 권장하지 않는 요구 사항에 맞게 Qt 프레임 워크를 변경하지 않는 한 해당 방법을 재정의 할 방법이 없으며 다른 방법을 생각해야합니다.

관련 문제