c++ - 如何使用 C++ 继承和扩展 QCalendarWidget

标签 c++ linux qt qt4

目前QCalendarWidget只支持SingleSelection或NoSelection。我希望能够编写一个从 Qt 4.6.2 中的 QCalendarWidget 继承的小部件,并添加让用户选择一周中的任何一天并选择自定义周的功能。

例如点击 2010 年 8 月 5 日星期四,然后选择从 7 月 31 日星期六到 8 月 6 日星期五(含)的所有日期。

我在 Qt 方面的经验有限,而且我已经有一段时间没有使用 C++ 了,所以我是否需要担心在 Qt 中继承时实现复制构造函数或虚拟析构函数,或者需要注意的任何其他陷阱?对于这样的自定义小部件,头文件和 cpp 文件会是什么样子?添加我的自定义绘制逻辑和 SelectionMode 的最佳位置在哪里?

我正在使用 gcc 版本 4.4.3 (Ubuntu 4.4.3-4ubuntu5) 和 Qt 4.6.2

最佳答案

读完QCalendarWidget source code ,在我看来这可能是继承的情况,但会有问题。

首先,从 QObject 派生的类,包括小部件,不应该有复制构造函数。对此的解释is here . QObject 析构函数是虚拟的,所以无论你如何声明你的,it will be virtual too .

当扩展一个类来改变它的行为时,寻找虚函数。如果没有,则很好地表明继承可能不是最佳方法。在这种情况下,我们有三个虚拟方法:

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

前两个是来自 QWidget 的虚拟对象,用于调整小部件的大小。它们可能并不重要。最后一个可能会完成您想要的部分操作:当用户选择一周中的某一天时,让整周显示为已选中。

现在,对于可能的问题:

选择模式属性是非虚拟的,而且是枚举值的。不能扩展枚举类型以包含新提议的 WeekSelection 值。如果您不必在运行时更改选择模式,则可以安全地忽略此属性并仅使用周选择。 (忽略属性是一个很好的指示,表明您的小部件可能应该具有 QCalendarView 而不是 QCalendarView。)

QCalendarView 也是一个复合小部件(不同于标签或按钮)。在内部,它由一个 QTableView、许多 QToolButtons、一个 QSpinBox 等组成。这种小部件更难通过继承进行扩展,因为您无权访问其内部结构,并且大部分行为(例如绘制和处理输入事件)都是由内部小部件完成的,而不是由 QCalendarView 本身完成的。

在某些情况下,您可以使用 findChildren() 寻找子部件,并通过更改属性和 installing event filters 来修改它们的行为。 .然而,这很容易被破坏,因为只要保留该类的公共(public)二进制接口(interface),诺基亚就可以将内部结构从 4.6.2 更改为 4.6.3。

问问自己新的小部件是否必须继承 QCalendarWidget。如果不是,并且继承会让您走入死胡同,请考虑复制 QCalendarWidget 的源代码并根据您的需要进行调整。你可以走得更远 clone the Qt source code ,更改原始小部件本身以包含您的行为,并向诺基亚提出合并请求。

关于c++ - 如何使用 C++ 继承和扩展 QCalendarWidget,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3404974/

相关文章:

ruby - 我如何获得 PTY.spawn 子退出代码?

c++ - 在旧代码中以最少的更改创建基于类型的标识号

qt - 如何在 qt creator 中删除项目?

c++ - 使用 QStyle 设置全局默认最小 QPushButton 高度

c++ - 通过 GtkBuilder 访问 GtkLabel

c++ - 使用 Boost.Asio 进行混合 tcp::iostream 和套接字操作

需要 C++ 静态方法

c++ - Linux 中的 gettimeofday 函数线程安全吗?

c++ - C++总理代码没有给出正确的输出

c++ - 遍历目录及其子目录