QMetaObject::invokeMethod:没有此类方法QTextCursor::MoveOperation,QTextCursor::MoveMode 在C++中使用一个2线程QT程序时使用下面的代码,我得到了这个运行时错误(程序仍然运行):

QMetaObject::invokeMethod:没有此类方法QTextCursor::MoveOperation,QTextCursor::MoveMode 在C++中使用一个2线程QT程序时使用下面的代码,我得到了这个运行时错误(程序仍然运行):,c++,multithreading,qt,C++,Multithreading,Qt,守则: QMetaObject::invokeMethod(textEdit, "moveCursor", Qt::QueuedConnection, Q_ARG(QTextCursor::MoveOperation, QTextCursor::End), Q_ARG(QTextCursor::MoveMode, QTextCursor::MoveAnchor)); (textEdit是一个QTextEdit对象) 我知道只能调用可调用的函数/插槽。即使查看QT

守则:

QMetaObject::invokeMethod(textEdit, "moveCursor", Qt::QueuedConnection,
        Q_ARG(QTextCursor::MoveOperation, QTextCursor::End),
        Q_ARG(QTextCursor::MoveMode, QTextCursor::MoveAnchor));
(textEdit是一个QTextEdit对象)

我知道只能调用可调用的函数/插槽。即使查看QT的源代码,我也不知道这个函数是否是不可调用的。 我做错了什么? 如果此方法确实不可调用,是否有其他方法将光标从另一个线程移动到末尾


谢谢。

QTextEdit::moveCursor()
既不是插槽,也没有标记为可调用。但是只有标有
Q\u INVOKABLE
的插槽和函数才能使用
QMetaObject::invokeMethod()
调用

或者在目标线程中的对象中实现自己的插槽。 或者使用延迟为0的
QTimer::singleShot()
,它有一个重载,它接受函数指针并与非插槽函数一起工作

另一方面,查看Qt源代码以查找插槽或可调用函数非常容易,因为可以直接在函数声明中看到。以下是一些例子:

// a() is a normal function
public:
    void a();

// b(), c() and d() are slots
public slots:
    void b();

public Q_SLOTS:
    void c();

public:
    Q_SLOT void d();

// e() is invokable
public:
    Q_INVOKABLE void e();

QTextEdit::moveCursor()
既不是插槽,也没有标记为可调用。但是只有标有
Q\u INVOKABLE
的插槽和函数才能使用
QMetaObject::invokeMethod()
调用

或者在目标线程中的对象中实现自己的插槽。 或者使用延迟为0的
QTimer::singleShot()
,它有一个重载,它接受函数指针并与非插槽函数一起工作

另一方面,查看Qt源代码以查找插槽或可调用函数非常容易,因为可以直接在函数声明中看到。以下是一些例子:

// a() is a normal function
public:
    void a();

// b(), c() and d() are slots
public slots:
    void b();

public Q_SLOTS:
    void c();

public:
    Q_SLOT void d();

// e() is invokable
public:
    Q_INVOKABLE void e();