QMetaObject :: invokeMethod:没有这样的方法QTextCursor :: MoveOperation,QTextCursor :: MoveMode

时间:2017-05-09 14:20:34

标签: c++ multithreading qt

在c ++的双线程QT程序中使用以下代码时,我得到了这个运行时错误(程序一直在运行):

QMetaObject::invokeMethod: no such method QTextCursor::MoveOperation,QTextCursor::MoveMode

代码:

QMetaObject::invokeMethod(textEdit, "moveCursor", Qt::QueuedConnection,
        Q_ARG(QTextCursor::MoveOperation, QTextCursor::End),
        Q_ARG(QTextCursor::MoveMode, QTextCursor::MoveAnchor));

(textEdit是一个QTextEdit对象)。

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

感谢。

1 个答案:

答案 0 :(得分:2)

QTextEdit::moveCursor()既不是插槽也不标记为可调用。但只能使用Q_INVOKABLE调用标有QMetaObject::invokeMethod()的广告位和功能。

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

在旁注中,查看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();