Подкласс QCompleter, виртуальный слот в моем подклассе не вызывается - PullRequest
1 голос
/ 16 августа 2011

Я подклассифицирую 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);
}

Ответы [ 3 ]

1 голос
/ 16 августа 2011

Вы можете использовать модель, возвращаемую QCompleter :: завершенииModel (), и ее сигналы для отслеживания счетчика завершений:

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 голос
/ 16 августа 2011

Чтобы переопределить метод в C ++, базовый класс должен определить его как виртуальный. Добавление виртуального метода в ваш подкласс не меняет это поведение.

Аналогично, нет способа переопределить этот метод (если у вас нет коммерческой лицензии и вы не измените Qt Framework для своих нужд, который я бы не рекомендовал), и вам не нужно думать о другом способе.

1 голос
/ 16 августа 2011

Согласно этому «Этот метод также является слотом Qt с сигнатурой C ++ void setCompletionPrefix(const QString&)». с http://www.riverbankcomputing.co.uk/static/Docs/PyQt4/html/qcompleter.html#setCompletionPrefix эта функция не является виртуальной и поэтому не может быть переопределена. Я подозреваю, что есть альтернативный интерфейс для переопределения этой возможности.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...