当前位置: 首页 > 工具软件 > appendText > 使用案例 >

Qt 在子线程调用文本框 appendPlainText/appendText时出错

贾飞章
2023-12-01

在一个窗口中添加了 QTextEdit/QPlainTextEdit控件,并在生成的新的子线程中直接调用了 QTextEdit/QPlainTextEdit 的append/appendPlainText函数,这个时候就会出现下面的错误:

QObject::connect: Cannot queue arguments of type 'QTextCursor'

(Make sure 'QTextCursor' is registered using qRegisterMetaType().)

QObject::connect: Cannot queue arguments of type 'QTextBlock'

(Make sure 'QTextBlock' is registered using qRegisterMetaType().)

QObject::connect: Cannot queue arguments of type 'QTextCursor'

(Make sure 'QTextCursor' is registered using qRegisterMetaType().)

解决方法:

Qt中带参数的信号如果在线程中被发送,那么必须放入队列里面,由于QTextEdit是Qt库自带的,改起来不方便,所以我采用了一个简单的方法来解决这个问题,原理是在窗口类中定义信号和槽,并实现另一个接口函数,这个接口函数由线程调用,在接口函数中emit一个信号,示例代码如下:

主线程.h文件添加信号和槽及函数:

signals:
   void AppendText(const QString &text);
private slots:
    void SlotAppendText(const QString &text);
public:
    void Append(const QString &text);

.cpp实现

构造函数后添加

connect(this, SIGNAL(AppendText(QString)), this, SLOT(SlotAppendText(QString)));
/**
 * @brief 子线程可编辑文本框追加内容
 * @param text
 */
void MainWindow::Append(const QString &text)
{
    emit AppendText(text);
}
void MainWindow::SlotAppendText( const QString & text)
{
    ui->logTextEdit->appendPlainText(text);
}

子线程:

Append("XXX");

问题解决。

 类似资料: