草庐IT

c++ - Qt 5 和 QProcess 使用信号/槽 readyRead 重定向标准输出

这个问题困扰着我,因为它应该有效,但遗憾的是它没有。我试图实现的是读取某个进程的标准输出并让另一个进程处理它,即打印出来。产生输出的过程如下所示:#include#include#includeintmain(){for(inti=0;i进程是在另一个应用程序中启动的,如下所示:#include...QProcess*process=newQProcess;SomeClass*someClass=newSomeClass(process);connect(process,SIGNAL(readyRead()),someClass,SLOT(onReadyRead()));process

c++ - 如果从同一个信号调用两个槽,Qt 可以同时调用它们吗?

如果在两个不同的线程中有两个槽,并且这些槽连接到第三个线程中的信号。两个槽会同时被信号调用还是每次都被同步调用?我问是因为我想发送一些回调数据结构(用QSharedPointer封装)并询问是否需要内部锁定机制。 最佳答案 如果您使用Qt::QueuedConnection将信息传递给线程,则不需要锁定实际的信号/槽调用,因为QueuedConnection机制以线程安全的方式处理此问题。话虽如此,您仍然需要保护您的线程访问的任何共享内存,无论它们是如何调用的。第三个线程发出单个信号以导致调用两个槽这一事实不会改变这一点。

c++ - Qt 中的槽函数是否在另一个线程上运行?

在下面的函数中,管理器会发出finished(QNetworkReply*)信号,然后槽函数getCategories(QNetworkReply*)会被调用。voidgetCategories(){connect(manager,SIGNAL(finished(QNetworkReply*)),this,SLOT(getCategories(QNetworkReply*)));for(inti=0;i如果在第一次调用槽函数时发出第二个信号,Qt是否会启动另一个线程来运行槽函数作为对第二个信号的响应?如果是这样,有没有什么方法可以让插槽函数的第二次调用等到第一次调用完成?更新:我的意思

c++ - Qt 信号槽 : Signal is sent but Slot is not called

我在C++的VisualStudio2013中使用Qt。我正在尝试将信号连接到插槽。问题是信号已发送,但槽函数从未被调用,我不知道发生了什么。这段代码之前可以工作,但是在我将代码从32位的VisualStudio2012迁移到64位的VisualStudio2013并进行一些更改后,它不再工作了。它打印调试语句:发送前、发送图像和连接,但不打印接收到的图像。有人可以帮忙吗?Streamer.hsignals://SignaltooutputframetobedisplayedvoidprocessedImageStream(constvector&imgs,constQImage&im

c++ - Qt 中的信号和槽到底是什么?

我知道它们在概念上是如何工作的,但是信号和槽在Qt框架中是如何实现的?QtCreator将它们视为关键字,但它们只是一组宏,还是在编译这些源文件之前需要特殊的预处理器?换句话说,如果我在我的代码中使用Qt的信号/槽功能,我可以轻松地在任何C++编译器上编译它吗? 最佳答案 Qt的许多功能(包括信号)需要对源进行预处理usingtheQtMeta-ObjectCompiler(MOC).如果您使用Qt的信号功能,您可以在Qt支持的任何编译器和平台上编译您的源代码。如果您需要在Qt不支持的平台上进行编译,您可能会倒霉,或者至少无法进行很

c++ - 为什么我不能从基类槽 Qt 调用虚函数

有人可以向我解释为什么没有在基类插槽中调用重写的方法,而是我有一个方法的基本版本:classThreadsDispatcher:publicQObject{Q_OBJECTpublic:explicitThreadsDispatcher(QObject*parent=0);virtual~ThreadsDispatcher();virtualvoidOnThreadFinished(IThreadable*pWorker);publicslots:voidslotThreadFinished(IThreadable*pWorker);};voidThreadsDispatcher::s

c++ - 当在错误槽中启动事件循环时发生 ContentNotFoundError 时,QNetworkReply 会发出两次错误信号

我正在使用QtSDK4.7.3我在(voidtest())中这样做:mgr=newQNetworkAccessManager();reply=mgr->get(QNetworkRequest(QUrl("http://developer.qt.nokia.com/fileNotExisting.txt")));connect(reply,SIGNAL(error(QNetworkReply::NetworkError)),SLOT(onError(QNetworkReply::NetworkError)),Qt::ConnectionType::UniqueConnection);当然

c++ - Qt 我可以在构造函数中将信号/槽连接到自身吗?

编辑:与信号/插槽/连接无关。问题是构造函数调用构造函数。可能有更好的方法来做到这一点-我很想听听那些......我有一个派生自QLabel的MyClass。我想在信号中传递更多关于派生类的数据,而不是基本信号所做的。所以我创建了一个插槽来拦截customContextMenuRequested信号并发出一个包含更多数据的修改后的信号。当我尝试在构造函数中连接此信号时,我的插槽永远不会被调用。但是如果我移动Policy并将线连接到父窗口小部件(不是类层次结构父窗口)以便它们在MyClass完全构建后执行,那么我的插槽将被调用。但我一直希望为这个类连接它,这似乎是我想要在它的构造函数中使

c++ - Qt在网络上的信号/槽机制

我希望能够通过网络发送Qt信号。使用Qt的元类型系统序列化信号调用非常简单:使用静态方法::fromSignal创建一个qMetaMethod使用创建的元方法获取方法名称、参数名称、它们的typeIds[1]和值。将所有内容打包成您喜欢的格式(JSON、XML)并发送。但到目前为止,我无法弄清楚如何使用序列化数据调用信号:QMetaObject::invokeMethod(..)将信号/方法名称作为字符串。问题是参数:它们必须作为QGenericArgument提供,并且只能通过使用需要实际类型的Q_ARG宏来创建(不是它的名称的字符串或typeId)和相关值。此外,参数的数量必须在编

c++ - 使用 C++ Lambda 函数作为 Qt 中的槽是否有助于保持库的二进制兼容性?

我关心的是使在Qt5.9下开发的小部件库能够在未来升级而无需重新编译已经使用它的代码。当然,我是从PImpl习语开始的,它的Qt版本描述了here和here。然而,在尝试调整我的代码时,我想到了一个想法,与其添加新的数据成员并将它们移动到一个单独的私有(private)类,不如使用Qt的带有lambda函数的信号/槽机制,并且只有本地变量。让我们用下面的例子来说明这个想法:变体A:classFoo:publicQWidget{Q_OBJECTpublic:explicitFoo(QWidget*parent=nullptr);private://AbunchofdatamembersQ