繁体   English   中英

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

[英]How do I inherit from and extend QCalendarWidget using C++

目前,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 源代码之后 ,在我看来,继承可能是这种情况,但是会出现问题。

首先,从QObject派生的类(包括小部件)不应具有复制构造函数。 对此的解释在这里 QObject析构函数是虚拟的,因此无论您如何声明它也将是虚拟的

扩展类以更改其行为时,请寻找虚函数。 如果没有的话,这很好地表明了继承可能不是最好的方法。 在这种情况下,我们有三种虚拟方法:

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

前两个是来自QWidget的虚函数,用于处理窗口小部件的大小。 它们可能并不重要。 最后一个可能满足您的要求:当用户选择一周中的某一天时,使整个星期都显示为选中状态。

现在,针对可能的问题:

选择模式属性是非虚拟的,而且具有枚举值。 不能将枚举类型扩展为包括新提议的WeekSelection值。 如果您不必在运行时更改选择模式,则可以放心地忽略此属性,仅使用星期选择。 (忽略的属性是一个很好的迹象,你的widget也许应该一个QCalendarView,而不是成为一个QCalendarView。)

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

在某些情况下,您可以使用findChildren()寻找子窗口小部件,并通过更改属性和安装事件过滤器来修改其行为。 但是,这很容易中断,因为只要保留该类的公共二进制接口,诺基亚就可以将内部信息从4.6.2更改为4.6.3。

问问自己新的窗口小部件是否必须继承自QCalendarWidget。 如果不是这样,继承会导致死胡同,请考虑复制QCalendarWidget的源代码并使其适应您的需求。 您甚至可以进一步克隆Qt源代码 ,更改原始小部件本身以包含您的行为,并向诺基亚提出合并请求。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM