【问题标题】:Qt QLCDNumber TimerQt QLCD数字定时器
【发布时间】:2013-10-21 07:13:19
【问题描述】:

我使用 QLCDNumber 制作了一个计时器,以显示在我的状态栏上。我试图连接到我的插槽。但是,似乎该插槽永远不会被调用。谁能告诉我哪里出了问题?

谢谢。

顺便说一句,如果我使用这种方法,计时器是否会根据时钟时间的计时方式进行计数? (即秒数到59,会重置为0,分钟会变成1。)

我的.h:

class StatusBar : public QStatusBar, QLCDNumber
{
    Q_OBJECT
public:
    StatusBar()
    {
        m_simulation = 0;
        createButtons();
    };
    ~StatusBar() { };

public slots:
    void countUp();

private:
    QLCDNumber *lcdSimulation;
    int m_simulation;
    QTimer *simulationTimer;
};

我的 .cpp:

void StatusBar::createButtons()
{
    ...

    lcdSimulation = new QLCDNumber;
    lcdSimulation->setNumDigits(8);
    lcdSimulation->display("12:00:00");
    simulationTimer = new QTimer;
    simulationTimer->start(5000);
    QObject::connect(simulationTimer, SIGNAL(timeout()), lcdSimulation, SLOT(countUp()));
    addWidget(lcdSimulation);

    ...
}

void StatusBar::countUp()
{
    m_simulation++;
    lcdSimulation->display(m_simulation);
}

【问题讨论】:

    标签: c++ qt timer


    【解决方案1】:

    问题似乎在于信号的目标对象不正确。

    错误

    QObject::connect(simulationTimer, SIGNAL(timeout()), lcdSimulation, SLOT(countUp()));
    

    正确

    QObject::connect(simulationTimer, SIGNAL(timeout()), this, SLOT(countUp()));
    

    因为您的 countUp() 定义在 StatusBar 类中,而不是在 QLCDNumber 中。

    【讨论】:

    • 我更改了正确的语句,但它返回给我一个error C2594 'argument' : ambigous conversions from StatusBar* const to const Object*。我认为 connect 语句出了点问题,但我只是不知道为什么没有调用它。
    • 那是因为你使用了菱形推导:你从 QStatusBar 和 QLcdNumber 推导而来,它们都从 QObject 推导而来。因此,歧义
    • 我明白了。在这种情况下,我应该如何以及从哪个继承?我的 lcdSimulation 坐在状态栏上。因此,我需要从 QStatusBar 和 QLCDNumber 继承。或者有什么解决方法?
    • @Wallace,我认为您不需要继承 QLCDNumber - 您已经将 QLCDNumber 作为成员变量。
    • @vahancho:谢谢!我删除了 QLCDNumber 并且只从 QStatusBar 继承。但是,还有另一个问题。我想让它像时钟计时器一样计数(即 12:00:00、12:00:01、12:00:02 ...)。但在这种情况下,它会重置为 0、1、2、3...
    【解决方案2】:

    很难这样说,但我会检查一下:

    • 您的头文件已正确 moc-ed(检查 moc_statusbar.cpp 是否已生成、编译和链接)
    • 您的 StatusBar 类构成 (*lcdSimulation) 并派生自 QLCDNumber :您应该选择哪一个是最好的(最有可能的构成)
    • connect 返回一个布尔值:您应该对此进行断言。如果断言失败,请检查控制台以了解发生了什么(不匹配时发出跟踪)
    • 在您的情况下,插槽是在this 中定义的,而不是lcdNumber

    重做的代码:

    bool b=QObject::connect(simulationTimer, SIGNAL(timeout()), this, SLOT(countUp()));
    Q_ASSERT(b);
    

    【讨论】:

    • 1) 是的,头文件是正确的moc-ed。 2) 我的 StatusBar 类派生自 QLCDNumber 并且 lcdSimulation 被声明为私有成员。 3) 我尝试了 assert 方法,它返回了一个 error C4189 : 'b' local variable is initialized but not referenced. 但是,我已经包含了 Q_ASSERT(b);
    • 我定义为this。但是,它返回给我error C2594 'argument' : ambigous conversions from StatusBar* const to const Object*,我知道它是从 QStatusBar 和 QLCDNumber 派生的。
    猜你喜欢
    • 2020-05-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-04-25
    • 1970-01-01
    相关资源
    最近更新 更多