Использование QTimeEdit с time_t - шаблон адаптера C ++ - PullRequest
1 голос
/ 10 апреля 2020

Мне нужно сделать адаптер для QTimeEdit , чтобы использовать его с time_t in:

  1. конструктором QTimeEdit (time_t)
  2. void setTime (time_t)
  3. time_t time () Я сделал 1. и его работа.
class QTimeEditAdapter: public QTimeEdit {
public:
    QTimeEditAdapter(time_t t) {
        tm1 = t;
        tm *ltm = localtime(&tm1);
        int hours = ltm->tm_hour;
        int min = ltm->tm_min;
        this->setTime(QTime(hours,min));
    }
private:
    time_t tm1;
};
int main(int argc, char *argv[])
{
    time_t tm1;
    tm1 = time(NULL);

    //other qt widgets code

    QTimeEdit* timeEdit = new QTimeEditAdapter(tm1);

    //more other qt widgets code

Но если я адаптирую setTime, добавив

void setTime(time_t t1)

класс переопределяет setTime, и я получаю ошибки как от конструктора, так и от метода setTime. Я не нашел другого метода для установки времени в QTimeEdit, но я думаю, что должен быть способ лучше, чем мой

1 Ответ

1 голос
/ 12 апреля 2020

Член производного класса с тем же именем, что и член базового класса, скрывает прямое использование от члена базового класса - C ++ Primer (5-е издание), Pg 618

Перегрузка функций на основе списка параметров невозможна между производными и базовыми классами. Если вы делаете вызов, например this->setTime(QTime(hours,min));, где this - это QTimeEditAdapter, только ваш новый QTimeEditAdapter::setTime(time_t) будет учитываться в разрешении перегрузки. Это вызывает ошибку компиляции.

Чтобы обойти это, вы можете напрямую ссылаться на базовый класс в конструкторе:

QTimeEditAdapter::setTime(QTime(hours,min));

, но это не поможет другим пользователям вашего адаптера получить доступ к original setTime.

Другой обходной путь - вместо этого добавить следующее:

void setTime(QTime qt)
{
        QTimeEdit::setTime(qt);
}

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

Чтобы избежать этих хитрых проблем, вероятно, лучше просто выбрать другое имя метода для QTimeEditAdapter::setTime(time_t) метода.

...