Как мне наследовать и расширять QCalendarWidget с помощью C ++ - PullRequest
2 голосов
/ 04 августа 2010

В настоящее время QCalendarWidget поддерживает только SingleSelection или NoSelection.Я хотел бы иметь возможность написать виджет, который наследуется от QCalendarWidget в Qt 4.6.2, и добавляет возможность для пользователя выбирать любой день недели и выбирать эту пользовательскую неделю.

Например, нажмите наЧетверг, 5 августа 2010 года, и все дни с субботы, 31 июля, по пятницу, 6 августа включительно, меня выбирают.

Мой опыт работы с Qt ограничен, и с тех пор, как я немного поработал над C ++, мне нужно беспокоиться ореализация конструктора копирования или виртуальных деструкторов при наследовании в Qt, или любые другие подводные камни, о которых следует знать?Как будут выглядеть заголовочные файлы и файлы cpp для такого пользовательского виджета, и где лучше всего добавить мою собственную логику рисования и SelectionMode?

Я использую gcc версии 4.4.3 (Ubuntu 4.4.3-4ubuntu5) и Qt 4.6.2

1 Ответ

1 голос
/ 05 августа 2010

После прочтения исходного кода QCalendarWidget мне кажется, что может быть причиной наследования, но будут проблемы.

Во-первых, классы, которыепроизводные от QObject, включая виджеты, не должны иметь конструкторов копирования.Объяснение этому здесь .Деструктор QObject является виртуальным, поэтому, независимо от того, как вы объявляете свой, он также будет виртуальным .

При расширении класса для изменения его поведения ищите виртуальные функции.Если их нет, это хороший признак того, что наследование может быть не лучшим подходом.В этом случае у нас есть три виртуальных метода:

virtual QSize sizeHint() const;
virtual QSize minimumSizeHint() const;
virtual void paintCell(QPainter *painter, const QRect &rect, const QDate &date) const;

Первые два являются виртуальными из QWidget и имеют дело с определением размера виджета.Они, вероятно, не важны.Последний может делать часть того, что вы хотите: сделать целую неделю выбранной, когда пользователь выбирает день этой недели.

Теперь, для возможных проблем:

ВыборСвойство mode не является виртуальным и, кроме того, имеет значение enum-value.Нельзя расширить перечисляемый тип для включения нового предложенного значения WeekSelection.Если вам не нужно менять режимы выбора во время выполнения, вы можете спокойно игнорировать это свойство и работать только с недельными выборами.(Игнорирование свойства является хорошим признаком того, что ваш виджет должен, вероятно, иметь QCalendarView, а не быть QCalendarView.)

QCalendarView также является составным виджетом (в отличие отярлык или кнопка).Внутренне он состоит из QTableView, множества QToolButton, QSpinBox и так далее.Этот вид виджета сложнее расширить с помощью наследования, поскольку у вас нет доступа к его внутренним элементам, и большая часть поведения (например, рисование и обработка входных событий) выполняется внутренними виджетами, а не самим QCalendarView.

В некоторых ситуациях вы можете искать дочерние виджеты с помощью findChildren() и изменять их поведение, изменяя свойства и устанавливая фильтры событий .Однако это может привести к поломке, поскольку Nokia может изменить внутреннее устройство с 4.6.2 на 4.6.3, если сохраняется открытый двоичный интерфейс класса.

Спросите себя, если новый виджет должен наследовать от QCalendarWidget.Если нет, и наследование ведет вас в тупик, подумайте о копировании исходного кода QCalendarWidget и адаптации его к вашим потребностям.Вы можете пойти еще дальше и клонировать исходный код Qt , изменить сам оригинальный виджет, чтобы он включал ваше поведение, и предложить запрос на слияние обратно в Nokia.

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