C++ 如何从其他类n Qt C+调用QTimer+;?

C++ 如何从其他类n Qt C+调用QTimer+;?,c++,qt,qml,qtimer,C++,Qt,Qml,Qtimer,我在Qt中使用QML。 有两个班, 板级和时间级 QML调用Board::start() Board::start()调用TimerUi::startTimer() 问题是,TimerUi类中的QTimer根本没有启动。我想做的主要事情是将所有基于计时器的函数放在一个地方,并且能够从任何类调用它 如果我直接从QML调用TimerUi::startTimer(),它就会工作 谁能给我解释一下,我的错误在哪里 main.cpp #include <QDebug> #include <

我在Qt中使用QML。 有两个班, 板级和时间级

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

    如果我直接从QML调用TimerUi::startTimer(),它就会工作

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

    main.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();
    }
    
    #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);
    }
    
    #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();
    }
    
    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
    
    #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
    
    \ifndef BOARD\u H
    #定义BOARD_H
    #包括
    #包括
    #包括
    班级董事会:公共QObject{
    Q_对象
    Q_属性(bool isStarted READ isStarted NOTIFY isStartedChanged WRITE
    setIsStarted)
    公众:
    显式板(QObject*parent=nullptr);
    bool-isStarted();
    Q_可调用的void init();
    Q_可调用的void start();
    信号:
    作废已开始更改(bool b_已开始);
    公众时段:
    私人:
    QString b_启动;
    启动静态布尔布尔布尔布尔;
    };
    #endif//BOARD_H
    
    board.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();
    }
    
    #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);
    }
    
    #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();
    }
    
    #包括“board.h”
    #包括“timerui.h”
    #包括
    #包括
    #包括
    #包括
    #包括
    #包括
    bool Board::b_isStarted=0;
    bool Board::isStarted(){return b_isStarted;}
    无效板::设置开始(布尔和设置开始){
    b_isStarted=isStarted;
    发出isStartedChanged(isStarted);
    }
    线路板::线路板(QObject*parent):QObject(parent){}
    void Board::init(){
    
    qDebug()您在Board::start的本地范围内声明了TimerUI,当函数结束时它将被销毁。这可能是您的问题的根源。

    我们需要更多详细信息。请生成一个请提供您的代码而不是解释它。我怀疑通常会发生错误,您指的是两个不同的实例,但没有代码。…我们不能说移动
    TimerUi-TimerUi;
    private:
    section如果我将其移动到private section,它会在连接上崩溃。请提供一个例子,说明如何避免这个问题?我无法为您决定想要实现什么,但据我所知,我认为您的TimerUi变量应该是decla作为你们班董事会的一员。