Ich habe einen Hintergrund-Thread und der Thread ruft einige Methoden, die die Benutzeroberfläche aktualisieren (um Fortschrittsbalken anzuzeigen und zusätzliche Informationen in Textbereichen anzuzeigen).Qt: Hintergrund Thread Aktualisierung UI-Thread
Wenn ich einige UI-Widget-Werte ändern, wird ein Assertion-Fehler "Keine Ereignisse an Objekte gesendet, die einem anderen Thread gehören" ausgelöst.
Mit Blick auf Foren, ich lese, dass ich QMetaObject :: invokeMethod Methode verwenden könnte, aber es funktioniert nur, wenn ich es das Qt :: DirectConnection-Flag übergeben, die tatsächlich den gleichen Fehler oben angezeigt wird.
Wenn ich Qt :: QueuedConnection oder Qt :: AutoConnection verwenden, gibt InvokeMethod false zurück.
Mein Code sieht ähnlich wie:
.h:
class A : public QMainWindow
{
Q_OBJECT
QProgressBar* pb;
public slots:
bool m(bool, int);
};
class B
{
A* a;
public:
void handleEvent();
};
.cpp:
bool A::m(bool x, int y)
{
pb->setValue(y);
return x;
}
void B::handleEvent()
{
//a->m(true, 12); //raises an assertion error
bool r;
//bool ret = QMetaObject::invokeMethod(a, "m", Qt::DirectConnection, Q_RETURN_ARG(bool, r), Q_ARG(bool, true), Q_ARG(int, 12)); //raises the same assertion error error
bool ret = QMetaObject::invokeMethod(a, "m", Qt::AutoConnection, Q_RETURN_ARG(bool, r), Q_ARG(bool, true), Q_ARG(int, 12)); //is ignored and ret contains false.
}
Sie wissen, was los ist oder was ich falsch mache? oder vielleicht, kann mir jemand einen anderen Ansatz vorschlagen, um mit meinem Anfängerproblem umzugehen?
Vielen Dank im Voraus,
Ernesto