从另一个 class 启动 QTimer
start QTimer from another class
我有以下 classes:
class MainWindow : public QMainWindow
{
public:
void StartTimer()
{
timer = new QTimer(this);
timer.start(100);
}
private:
QTimer *timer;
};
class AnotherClass
{
public:
MainWindow *window;
void runTimer()
{
window->StartTimer();
}
};
假设 window 指针正确指向 mainwindow,如果我尝试调用 runTimer()
,我会收到此错误:
QObject: Cannot create children for a parent that is in a different thread.
(Parent is MainWindow(0x7fff51ffe9f0), parent's thread is QThread(0x7fd1c8d001d0), current thread is QThread(0x7fd1c8f870c0)
QObject::startTimer: Timers can only be used with threads started with QThread
我对这个错误的猜测是因为 runTimer 是从不同的线程调用的,它也在尝试在同一个线程中初始化?而不是主window线程?
如果我在 main window 的默认构造函数中初始化计时器,我会收到
QObject::startTimer: Timers cannot be started from another thread
如何让 QTimer 从另一个 class 开始?
您可以使用信号和槽。
class AnotherClass : public QObject
{
Q_OBJECT
public:
MainWindow * window;
AnotherClass() : window( new MainWindow )
{
// Connect signal to slot (or just normal function, in this case )
connect( this, &AnotherClass::signalStartTimer,
window, &MainWindow::StartTimer,
// This ensures thread safety, usually the default behavior, but it doesn't hurt to be explicit
Qt::QueuedConnection );
runTimer();
}
void runTimer()
{
emit signalStartTimer();
}
signals:
void signalStartTimer();
};
我有以下 classes:
class MainWindow : public QMainWindow
{
public:
void StartTimer()
{
timer = new QTimer(this);
timer.start(100);
}
private:
QTimer *timer;
};
class AnotherClass
{
public:
MainWindow *window;
void runTimer()
{
window->StartTimer();
}
};
假设 window 指针正确指向 mainwindow,如果我尝试调用 runTimer()
,我会收到此错误:
QObject: Cannot create children for a parent that is in a different thread.
(Parent is MainWindow(0x7fff51ffe9f0), parent's thread is QThread(0x7fd1c8d001d0), current thread is QThread(0x7fd1c8f870c0)
QObject::startTimer: Timers can only be used with threads started with QThread
我对这个错误的猜测是因为 runTimer 是从不同的线程调用的,它也在尝试在同一个线程中初始化?而不是主window线程?
如果我在 main window 的默认构造函数中初始化计时器,我会收到
QObject::startTimer: Timers cannot be started from another thread
如何让 QTimer 从另一个 class 开始?
您可以使用信号和槽。
class AnotherClass : public QObject
{
Q_OBJECT
public:
MainWindow * window;
AnotherClass() : window( new MainWindow )
{
// Connect signal to slot (or just normal function, in this case )
connect( this, &AnotherClass::signalStartTimer,
window, &MainWindow::StartTimer,
// This ensures thread safety, usually the default behavior, but it doesn't hurt to be explicit
Qt::QueuedConnection );
runTimer();
}
void runTimer()
{
emit signalStartTimer();
}
signals:
void signalStartTimer();
};