【问题标题】:How to call QTimer from other class n Qt C++? [duplicate]如何从 Qt C++ 中的另一个类调用 QTimer? [复制]
【发布时间】:2020-02-05 20:46:12
【问题描述】:

我在 Qt 中使用 QML。 有两个班, Board 类和 TimerUi 类。

  1. QML 调用 Board::start()
  2. Board::start() 调用 TimerUi:​​:startTimer()。

问题是,TimerUi 类中的 QTimer 根本没有启动。我想要的主要事情是将所有基于计时器的函数放在一个地方,并且能够从任何类调用它。

如果我直接从 QML 调用 TimerUi:​​:startTimer() - 它可以工作。

谁能解释一下,我的错误在哪里?

ma​​in.cpp

#include <QDebug>
#include <QGuiApplication>
#include <QQmlApplicationEngine>
#include <QSettings>
#include <QString>
#include <stdint.h>
#include <stdio.h>
#include <stdlib.h>
#include "board.h"

int main(int argc, char *argv[]) {

  QCoreApplication::setAttribute(Qt::AA_EnableHighDpiScaling);
  QCoreApplication::setAttribute(Qt::AA_ShareOpenGLContexts);

  QGuiApplication app(argc, argv);

  QCoreApplication::setOrganizationName("Test");
  QCoreApplication::setOrganizationDomain("test");
  QCoreApplication::setApplicationName("Test");

  qmlRegisterType<Board>("io.qt.board", 1, 0, "Board");

  QQmlApplicationEngine engine;
  engine.load(QUrl(QStringLiteral("qrc:/Main.qml")));

  return app.exec();
}

Main.qml

import QtQuick 2.12
import QtQuick.Controls 2.9
import io.qt.board 1.0
import QtQuick.Controls.Imagine 2.4
import QtQuick.Window 2.3
import QtWebEngine 1.0

ApplicationWindow {
    id: window
    visible: true
    width: 800
    height: 600
    title: qsTr("Stack")

    // Init Board 
    Board {id: board}

    // Init
    Component.onCompleted: {
        board.init();
    }

    RoundButton {
        id: startButton
        x: 14
        y: 26
        width: 230
        height: 230
        text: !board.isStarted ? "Start" : "Stop"
        font.pointSize: 30
        background: Image { source: board.isStarted? "/stop.png" : "/start.png"; }
        onClicked: board.start()

        contentItem: Text {

            text: startButton.text
            font: startButton.font
            opacity: enabled ? 1.0 : 0.3
            color: "black"
            horizontalAlignment: Text.AlignHCenter
            verticalAlignment: Text.AlignVCenter

        }
    }


}

board.h

#ifndef BOARD_H
#define BOARD_H

#include <QObject>
#include <QString>
#include <QTimer>

class Board : public QObject {
  Q_OBJECT

  Q_PROPERTY(bool isStarted READ isStarted NOTIFY isStartedChanged WRITE
                 setIsStarted) 

public:
  explicit Board(QObject *parent = nullptr);

  bool isStarted();

  Q_INVOKABLE void init();
  Q_INVOKABLE void start();

signals:
  void isStartedChanged(bool b_isStarted);

public slots:

private:
  QString b_start;
  static bool b_isStarted;
};

#endif // BOARD_H

board.cpp

#include "board.h"
#include "timerui.h"

#include <QDebug>
#include <QString>
#include <QTimer>
#include <stdint.h>
#include <stdio.h>
#include <stdlib.h>

bool Board::b_isStarted = 0;

bool Board::isStarted() { return b_isStarted; }

void Board::setIsStarted(bool &isStarted) {
  b_isStarted = isStarted;
  emit isStartedChanged(isStarted);
}

Board::Board(QObject *parent) : QObject(parent) {}

void Board::init() {
  qDebug() << "Some init";
}

// Start
void Board::start() {

  TimerUi timerUi;

  if (!b_isStarted) {

    qDebug() << "isStarted";

    b_isStarted = true;

    timerUi.startTimer(); // <-- Here
  }

  emit isStartedChanged(b_isStarted);
}

timerui.h

#ifndef TIMERUI_H
#define TIMERUI_H

#include <QObject>
#include <QString>
#include <QTimer>

class TimerUi : public QObject {
  Q_OBJECT
  QTimer *m_timer;
  Q_PROPERTY(int minTimer READ minTimer NOTIFY minTimerChanged())

public:
  explicit TimerUi(QObject *parent = nullptr);
  Q_INVOKABLE void startTimer(QObject *target);
  int minTimer();

signals:
  void minTimerChanged();

public slots:
  void setTime();

private:
  static int m_minTimer;
};

#endif // TIMERUI_H

timer.cpp

#include "timerui.h"

#include <QDebug>
#include <QSettings>
#include <QTimer>

int TimerUi::m_minTimer = 0;

TimerUi::TimerUi(QObject *parent) : QObject(parent) {}

int TimerUi::minTimer() { return m_minTimer; }

void TimerUi::startTimer() {

  m_minTimer = 0;

  // Timer
  QTimer *m_timer = new QTimer(this);
  connect(m_timer, SIGNAL(timeout()), this, SLOT(setTime()));
  m_timer->start(1000);
}

void TimerUi::setTime() {

    minTimer++;
    qDebug() << "Hello " << minTimer;

  emit minTimerChanged();
}

谢谢。

【问题讨论】:

  • 我们需要更多细节。请生成S.S.C.C.E
  • 请提供您的代码而不是解释它。
  • 我怀疑发生了通常的错误,你指的是两个不同的实例,但没有代码......我们不能说太多
  • TimerUi timerUi;移动到private:部分
  • 如果我把它移到私人部分,它会在连接上崩溃

标签: c++ qt qml qtimer


【解决方案1】:

你在 Board::start 的本地范围内声明你的 TimerUI,它在函数结束时被销毁。这可能就是您的问题所在。

【讨论】:

  • 您能否举个例子,如何避免这个问题?
  • 好吧,我无法为您决定您想要实现什么,但据我了解,我认为您的 timerUi 变量应该简单地声明为您的班级 Board 的成员。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多