免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 20154 | 回复: 4
打印 上一主题 下一主题

QT线程中如何修改界面? [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2008-02-13 20:57 |只看该作者 |倒序浏览
我创建了一个网络监视线程,打算将这个线程分析的数据追加显示到一个 QTextEdit 控件上。
每当在这个线程中调用  QTextEdit->append (psDtata); 的时候,程序就出错误了。

我搜索了了QT文档,上说“只有 QApplication.exec() 主线程 才能对界面元素进行控制”。
在GTK多线程中操作界面,可以用 gdk_thread_enter()和gtk_thread_leave() 进入和离开临界区,请问在QT中该如何做呢?

论坛徽章:
0
2 [报告]
发表于 2008-02-14 04:11 |只看该作者
搞到半夜4点,终于解决了。

采用的办法是: 利用 signal/slot 机制。在 线程类中创建一个 signal (信号), 在界面管理类中 创建一个 slot (槽)。每当线程需要修改界面的时候, 就发送一个需要修改界面的信号, 界面收到这个信号以后,会调用相应的 方法(槽)来处理。

相关的部分代码:
/**
* @brief   线程管理类
*/

#include    <QThread>
class   MyThread :public  QThread
{
Q_OBJECT
public:
         virtual    void    run ();
signals:     //这里制造一个名为Log的信号
        void    Log                 (QString   sMessage);
};


/**
* @brief   窗口管理类
*/

#include    <QMainWindow>
class    MainWindow : public  QMainWindow
{
Q_OBJECT  
private:
      QTextEdit     m_qeLog;
public slots:  //这里制造一个名为Log的回调(槽),这个回调会对界面的一个QTextEdit控件追加一行文字(参数sMessage)
void    Log                 (QString   sMessage) {
    m_qeLog.append(sMessage);
}
};


    // 注册,其中Thread是类 MyThread的一个实例,window是类MainWindow的实例
QObject::connect(&Thread, SIGNAL(Log(QString)), &Window, SLOT(Log(QString)));


/**
* @brief   线程运行函数
*/

void    MyThread::run ()
{
     //......省略一些分析网络数据的代码
//发射一个Log信号,这样主线程就可以安全的对界面进行修改了
emit   Log(QString("<分析出来的数据>");
}

论坛徽章:
0
3 [报告]
发表于 2008-06-22 08:54 |只看该作者
好呀

论坛徽章:
0
4 [报告]
发表于 2010-12-24 21:41 |只看该作者
学习了???!!!!!

论坛徽章:
1
黑曼巴
日期:2020-02-27 22:54:26
5 [报告]
发表于 2010-12-27 10:05 |只看该作者
提示: 作者被禁止或删除 内容自动屏蔽
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP