Skip to content

Instantly share code, notes, and snippets.

@paulmasri
Created February 12, 2020 15:31
Show Gist options
  • Save paulmasri/a1e225516368e50ee4ac3f748779e758 to your computer and use it in GitHub Desktop.
Save paulmasri/a1e225516368e50ee4ac3f748779e758 to your computer and use it in GitHub Desktop.
Emit a signal from the main thread or the QThread thread
#include <QGuiApplication>
#include <QQuickView>
#include "MyClass.h"
int main(int argc, char *argv[])
{
QGuiApplication app(argc, argv);
QQuickView *view = new QQuickView();
qmlRegisterType<MyClass>("MyClass", 1, 0, "MyClass");
view->setSource((QUrl(QStringLiteral("qrc:/main.qml"))));
view->create();
view->show();
return app.exec();
}
import QtQuick 2.12
import QtQuick.Controls 2.5
import MyClass 1.0
Rectangle {
id: root
width: 800
height: 600
focus: true
MyClass {
id: tester
onErrorHappened: {
var s
switch (errorCode) {
case MyClass.ErrorA:
s = "Error A happened"
break
}
console.log(s)
}
}
Row {
spacing: 30
Button {
id: mainThreadButton
enabled: !tester.testRunning
text: "Test on main thread"
onClicked: tester.mainThreadError()
}
Button {
id: otherThreadButton
enabled: !tester.testRunning
text: "Test on other thread"
onClicked: tester.otherThreadError()
}
}
}
#include "MyClass.h"
MyClass::MyClass(QObject *parent)
: QThread(parent)
{
start();
}
MyClass::~MyClass()
{
stop();
}
void MyClass::mainThreadError()
{
emit errorHappened(ErrorCode::ErrorA);
}
void MyClass::otherThreadError()
{
m_signalError = true;
}
void MyClass::run()
{
m_running = true;
while (!m_signalStop) {
if (m_signalError) {
emit errorHappened(ErrorCode::ErrorA);
m_signalError = false;
}
msleep(1);
}
m_running = false;
m_signalStop = false;
}
void MyClass::stop()
{
if (m_running) {
m_signalStop = true;
wait();
}
}
#pragma once
#include <QThread>
#include <atomic>
class MyClass : public QThread
{
Q_OBJECT
public:
explicit MyClass(QObject *parent = Q_NULLPTR);
virtual ~MyClass() override;
enum ErrorCode {
ErrorA,
ErrorB,
ErrorC
};
Q_ENUM(ErrorCode)
public slots:
void mainThreadError();
void otherThreadError();
signals:
void errorHappened(ErrorCode errorCode);
private:
std::atomic<bool> m_running;
std::atomic<bool> m_signalStop;
std::atomic<bool> m_signalError;
void run() override;
void stop();
};
<RCC>
<qresource prefix="/">
<file>main.qml</file>
</qresource>
</RCC>
TEMPLATE = app
QT += qml quick
HEADERS += \
$$PWD/MyClass.h \
SOURCES += \
$$PWD/main.cpp \
$$PWD/MyClass.cpp \
RESOURCES += \
$$PWD/qml.qrc \
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment