将 QTimeEdit 与 time_t 一起使用 - 适配器模式 C++
Using QTimeEdit with time_t - Adapter pattern C++
我需要为 QTimeEdit 创建一个适配器,以便在 time_t 中使用它:
- 构造函数 QTimeEdit(time_t)
- void setTime(time_t)
- 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)
到 class 它重新定义了 setTime,我在构造函数和方法 setTime 中都遇到了错误。
我没有找到任何其他方法在 QTimeEdit 中设置时间,但我想一定有比我的更好的方法
A derived-class member with the same name as a member of the base
class hides direct use off the base-class member -- C++ Primer (5th Edition), Pg 618
基于参数列表的函数重载在派生和基础 classes 之间是不可能的。如果你像 this->setTime(QTime(hours,min));
这样调用,其中 this
是一个 QTimeEditAdapter
,只有你的新 QTimeEditAdapter::setTime(time_t)
会在重载决议中被考虑。这会导致编译错误。
要解决此问题,您可以在构造函数中直接引用基数-class:
QTimeEditAdapter::setTime(QTime(hours,min));
但这不会帮助您的适配器的其他用户访问原始 setTime
。
另一种解决方法是改为添加以下内容:
void setTime(QTime qt)
{
QTimeEdit::setTime(qt);
}
这解决了问题,但现在您要负责枚举基础 class 定义的所有(现在或将来)可能的重载。
为了避免这些棘手的问题,最好为您的 QTimeEditAdapter::setTime(time_t)
方法选择一个不同的方法名称。
我需要为 QTimeEdit 创建一个适配器,以便在 time_t 中使用它:
- 构造函数 QTimeEdit(time_t)
- void setTime(time_t)
- 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
但是如果我通过添加
来调整 setTimevoid setTime(time_t t1)
到 class 它重新定义了 setTime,我在构造函数和方法 setTime 中都遇到了错误。 我没有找到任何其他方法在 QTimeEdit 中设置时间,但我想一定有比我的更好的方法
A derived-class member with the same name as a member of the base class hides direct use off the base-class member -- C++ Primer (5th Edition), Pg 618
基于参数列表的函数重载在派生和基础 classes 之间是不可能的。如果你像 this->setTime(QTime(hours,min));
这样调用,其中 this
是一个 QTimeEditAdapter
,只有你的新 QTimeEditAdapter::setTime(time_t)
会在重载决议中被考虑。这会导致编译错误。
要解决此问题,您可以在构造函数中直接引用基数-class:
QTimeEditAdapter::setTime(QTime(hours,min));
但这不会帮助您的适配器的其他用户访问原始 setTime
。
另一种解决方法是改为添加以下内容:
void setTime(QTime qt)
{
QTimeEdit::setTime(qt);
}
这解决了问题,但现在您要负责枚举基础 class 定义的所有(现在或将来)可能的重载。
为了避免这些棘手的问题,最好为您的 QTimeEditAdapter::setTime(time_t)
方法选择一个不同的方法名称。