【发布时间】:2020-02-05 20:46:12
【问题描述】:
我在 Qt 中使用 QML。 有两个班, Board 类和 TimerUi 类。
- 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();
}
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:部分 -
如果我把它移到私人部分,它会在连接上崩溃