使用带有time_t的QTimeEdit-适配器模式C++



我需要为QTimeEdit制作一个适配器,以便在中与time_t一起使用

  1. 构造函数QTimeEdit(time_t(
  2. void setTime(time_t(
  3. time_t时间((我做了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中找到任何其他设置时间的方法,但我想肯定有比我的更好的方法

与基成员同名的派生类成员类隐藏了基类成员的直接使用--C++初级读本(第5版(,第618页

基于参数列表的函数重载在派生类和基类之间是不可能的。如果您拨打类似this->setTime(QTime(hours,min));的呼叫,其中thisQTimeEditAdapter,则在过载解决方案中只会考虑您的新QTimeEditAdapter::setTime(time_t)。这会导致编译错误。

要解决此问题,可以直接引用构造函数中的基类:

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

但这不会帮助适配器的其他用户访问原始CCD_ 5。

另一个解决方法是添加以下内容:

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

这修复了问题,但现在您要负责枚举基类定义的所有(当前或未来(可能的重载。

为了避免这些棘手的问题,最好为QTimeEditAdapter::setTime(time_t)方法选择一个不同的方法名称。

最新更新