После прочтения исходного кода 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.