C++ 如何从其他类n Qt C+调用QTimer+;?
我在Qt中使用QML。 有两个班, 板级和时间级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 <
#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作为你们班董事会的一员。