QTextEdit 控件,并在子个线程中直接调用了 QTextEdit 的append函数出错
2018-03-01 15:13
267 查看
当我在一个窗口中添加了 QTextEdit 控件,并在生成的新的子线程中直接调用了 QTextEdit 的append函数,这个时候就会出现下面的错误:
QObject::connect: Cannot queue arguments of type 'QTextCursor'
(Make sure 'QTextCursor' is registered using qRegisterMetaType().)
2. 解决方法
经过进一步检查发现原因是Qt中带参数的信号如果在线程中被发送,那么必须放入队列里面,由于QTextEdit是Qt库自带的,改起来不方便,所以我采用了一个简单的方法来解决这个问题,原理是在窗口类中定义信号和槽,并实现另一个接口函数,这个接口函数由线程调用,在接口函数中emit一个信号,示例代码如下:
1)在子线程中声明信号和函数
signals:
void AppendText(const QString &text);
在主线程(UI线程)中声明槽和函数
private slots:
void SlotAppendText(const QString &text);
2)声明接口函数
public:
void Append(const QString &text);
3)在类构造函数中连接信号与槽
connect(receiveInfo,
SIGNAL(AppendText(QString)),
this,
SLOT(SlotAppendText(QString)));
4)实现接口函数
void
ReceiveTh::Append(const
QString
&text)
5)实现槽函数
void Widget::SlotAppendText(const
QString
&text)
QObject::connect: Cannot queue arguments of type 'QTextCursor'
(Make sure 'QTextCursor' is registered using qRegisterMetaType().)
2. 解决方法
经过进一步检查发现原因是Qt中带参数的信号如果在线程中被发送,那么必须放入队列里面,由于QTextEdit是Qt库自带的,改起来不方便,所以我采用了一个简单的方法来解决这个问题,原理是在窗口类中定义信号和槽,并实现另一个接口函数,这个接口函数由线程调用,在接口函数中emit一个信号,示例代码如下:
1)在子线程中声明信号和函数
signals:
void AppendText(const QString &text);
在主线程(UI线程)中声明槽和函数
private slots:
void SlotAppendText(const QString &text);
2)声明接口函数
public:
void Append(const QString &text);
3)在类构造函数中连接信号与槽
connect(receiveInfo,
SIGNAL(AppendText(QString)),
this,
SLOT(SlotAppendText(QString)));
4)实现接口函数
void
ReceiveTh::Append(const
QString
&text)
{
emit AppendText(text);
}
5)实现槽函数
void Widget::SlotAppendText(const
QString
&text)
{
ui->textEdit->append(text);
//ui->textEdit->moveCursor(QTextCursor::End);
}
相关文章推荐
- 直接调用带参数方法创建新线程及 wpf中跨线程访问控件
- 单击QDateEdit直接调用QCalendarWidget日历控件
- C# 线程中调用控件出错
- 另开了一个线程,线程里面一个函数调用UpdateData(false),结果就出错,为什么?
- 为什么调用TWindowsMediaPlayer控件的newMedia()方法的时候会出错?
- 如何跨越线程调用窗体上的控件
- 线程中更新窗口不能直接调用UpdateData函数 的解决办法
- c#中跨线程调用windows窗体控件
- C#线程调用带参数的方法,给控件赋值
- windows跨线程调用控件的方法
- Winfrom跨线程调用控件
- Qt线程QThread简析(8个线程等级,在UI线程里可调用thread->wait()等待线程结束,exit()可直接退出线程,setStackSize设置线程堆栈,首次见到Qt::HANDLE,QThreadData和QThreadPrivate)
- c#中如何跨线程调用windows窗体控件
- c#如何跨线程调用窗体控件
- C# 线程调用主线程中的控件
- QT中线程调用GUI主线程控件的问题
- C# 子线程调用父线程控件
- 关于UI控件跨线程调用
- [.Net] 跨线程调用窗体控件
- 为什么说invalidate()不能直接在线程中调用