从QTime继承以自定义时间格式

时间:2014-01-16 11:20:52

标签: c++ qt inheritance override

我试图扩展QTime类以覆盖toString()函数。

---- ----- EDIT 我真正需要的是一种干净的方式,只显示秒的十分之一/千分之一,而不是毫秒。我目前的解决方案是:

QString original = qtime.toString("ss.zzz");
QString tenths = original.left(original.size() - 2);  // discards hundredths and msecs

我想做的是:

QString tenths = fooTime.myToString("ss.x");  // discards hundredths and msecs

--- ---- EDIT

此课程如下所示:

class FooTime : public QTime
{
public:
    FooTime()
    {}

    FooTime(int h, int m, int s = 0, int ms = 0)
    : QTime(h, m, s, ms)
    {}

    QString toString(const QString& format) const // the function I need to override
    {
        return format + " foo";
    }

    FooTime& operator=(const FooTime& t)
    {
        // ??? see below.
    }
};

不幸的是QTime在这些函数中有一个棘手的行为:

class QTime
{
    ...
    QTime addMSecs(int ms) const;
    QTime addSecs(int s) const;
    ...
}

实际上,我无法编写以下代码:

...
FooTime t(0, 0);
t = t.addMSecs(1000);  // compile error, no match for 'operator=' (operand types are 'FooTime' and 'QTime')

问题是FooTimeQTime,但QTime不是FooTime

如何覆盖FooTime运算符=以解决此问题?

3 个答案:

答案 0 :(得分:1)

  

如何覆盖FooTime operator =以解决此问题   问题

这应该足够了:

class FooTime : public QTime
{
public:
    FooTime& operator=(const QTime& t)
    {
        QTime::operator=(t);
        /* Assign other things if there is a need, manage memory etc,
           but it seems that there are no members in FooTime,
           just functions, so it's all. */
        return *this;
    }
};

答案 1 :(得分:1)

QTime的推导是一种完全错误的方法。如果您需要以不同方式格式化时间,只需编写一个独立函数:

QString myTimeFormat(const QTime & time) {
  const QString str = time.toString("ss.zzz");
  return str.left(str.size() - 2);
}

面向对象不是万能锤。有时一个普通的旧功能会很好。

答案 2 :(得分:1)

子类化和覆盖是没有意义的,这里简单的功能就可以完成这项工作 我会这样做(作为静态类方法或全局函数)。

QString myTimeFormat(const QTime & time) {
  QString result = QString("%1.%2").arg(time.second())
                                   .arg((time.msec()+50)/100);
  return result;
}