Qt - 如何从应用程序内部初始化一些动作?

Posted

技术标签:

【中文标题】Qt - 如何从应用程序内部初始化一些动作?【英文标题】:Qt - how to initialize some actions from inside of an application? 【发布时间】:2015-01-04 04:23:38 【问题描述】:

我正在用 Qt 编写简单的 UDP 聊天。有 QUDPSocket 类提供监听和发送消息。问题是它是由信号控制的,所以我必须调用 app.exec() 否则监听不会发出任何信号。这是我的 main.cpp:

#include <QtGui/QApplication>
#include "receiver.h"

int main(int argc, char *argv[])

QApplication app(argc, argv);
int port = 5555;
Receiver rec;
rec.startListening(port);
for(int i = 0; i < 5000; i++)

    QByteArray ba;
    ba = "Hello";
    rec.send(ba, QHostAddress::LocalHost, port);
    ba = rec.getLastMsg();
    QTextStream(stdout) << i << ":" << ba.data() << endl;


return app.exec();

问题是 QUDPSocket 在 app.exec() 被调用后开始工作。疯了。 Qt 有没有办法在不使用另一个线程发送 UDP 数据包的情况下处理这个问题?

谢谢

【问题讨论】:

【参考方案1】:

App.exec() 启动主循环,根本不会阻止您在同一个线程中发送数据包。您只需要根据事件发送它们 - 例如用户按下回车键或计时器(如果您只是在测试)。这就是基于事件的编程在基本上所有工具包中的工作方式。

【讨论】:

但是如何添加代码来执行 app.exec() 无限循环,该循环将一次又一次地以 GUI 刷新功能启动? Somethink like(如果存在):app.addFunctionToLoop(function);然后是 app.exec(); 正如我所说,您可以使用计时器,例如QTimer

以上是关于Qt - 如何从应用程序内部初始化一些动作?的主要内容,如果未能解决你的问题,请参考以下文章

是否可以在 Qt3.0 中发出跨进程信号或发布触摸/鼠标单击事件?

第38课 Qt中的事件处理(上)

从 Qt 应用程序内部模拟 TAB 或 SPACE 按键

Qt:从代码中的任何位置访问当前设置文件

如何让 Cocoa 应用程序从终端运行一个动作,然后返回结果

Qt--Qt中的事件处理