我已经创建了一个基于Qt的网络库,用于没有运行Qt事件循环的应用程序,而且不一定是Qt应用程序.这是通过QCoreApplication在每个答案的线程中创建一个实例来实现的.是否可以在不调用QApplication :: exec()的情况下创建本地事件循环?
这很好用,但它让Qt不高兴(我认为我担心我会尝试在主线程之外操作一个不起作用的GUI,但我不是),所以它会打印一个警告:WARNING: QApplication was not created in main() thread.
我想要压制那些否则将被打印到X11控制台的警告,并且最有可能导致我的用户输入一堆不必要的缺陷.但是,我只想压制这个错误,因为我qDebug出于某些合法目的使用并希望看到未来的警告.有没有办法做到这一点,就像某种Qt #pragma?
编辑:
在此之前提出了类似的问题:Qt控制台应用程序"警告:QApplication不是在main()线程中创建的",但答案基本上只是一个代码审查,没有任何有意义的想法来抑制警告.
在使用Qt和Qt Creator开发程序时,我目前遇到了非常烦人的问题.每当我尝试使用qDebug()一个QCoreApplication或QApplication使用前实例化qDebug(),没有任何输出,无论我在Qt Creator中或从一个普通的shell运行程序(我使用Fedora Linux系统的BTW).例如,即使是以下简单代码也会失败:
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
qDebug() << "TestOutput!" << endl;
}
Run Code Online (Sandbox Code Playgroud)
有谁知道该怎么办这个问题?先谢谢,马吕斯
我刚刚在 Linux Ubuntu 20.04 LTS 中安装了 QTCreator,单击“文件”->“新建项目”->“应用程序”->“QTConsole 应用程序”。制作了first.pro 文件和main.cpp 文件。
第一个.pro 包含:
QT -= gui declarative
QT += widgets
CONFIG += c++11 console
CONFIG -= app_bundle
DEFINES += QT_DEPRECATED_WARNINGS
SOURCES += \
main.cpp
qnx: target.path = /tmp/$${TARGET}/bin
else: unix:!android: target.path = /opt/$${TARGET}/bin
!isEmpty(target.path): INSTALLS += target
Run Code Online (Sandbox Code Playgroud)
main.cpp 包含:
#include <QCoreApplication>
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
return a.exec();
}
Run Code Online (Sandbox Code Playgroud)
错误出现在 QCoreApplication 行中。
我正在制作一个Qt5 QCoreApplication,用于从FTP服务器下载文件(从HTTP开始,现在已经切换).
我的程序要关闭时遇到问题.之后,我加入exit(0)到downloader.cpp我的计划现已结束,但我得到了以下错误:
QWaitCondition:线程仍在等待时被破坏.
我的代码如下:
main.cpp
#include <QCoreApplication>
#include <downloader.h>
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
Downloader d;
d.doDownload();
a.exec();
}
**downloader.cpp**
#include "downloader.h"
Downloader::Downloader(QObject *parent) :
QObject(parent)
{
}
void Downloader::doDownload() {
manager = new QNetworkAccessManager(this);
connect(manager, SIGNAL(finished(QNetworkReply*)), this, SLOT(replyFinished(QNetworkReply*)));
manager->get(QNetworkRequest(QUrl("ftp://ftp.fao.org/Public/GIEWS/windisp/40manual/wd4en.pdf")));
}
void Downloader::replyFinished (QNetworkReply *reply)
{
if(reply->error()) {
qDebug() << "ERROR!";
qDebug() << reply->errorString();
}
else
{
qDebug() << "Download finished!";
QFile *file = new QFile("C:/Users/jelicicm/Desktop/wd4en.pdf");
if(file->open(QFile::Append))
{
file->write(reply->readAll());
file->flush(); file->close(); …Run Code Online (Sandbox Code Playgroud) 我有一个静态类,希望它有静态QSettings.但是在初始化时我得到一个警告:
QSettings* MySQLConnection::settings = new QSettings(QApplication::applicationDirPath() + "/config.ini", QSettings::IniFormat);
Run Code Online (Sandbox Code Playgroud)
QCoreApplication :: applicationDirPath:请首先实例化QApplication对象
作为一种解决方法,我QSetting在主函数的开头手动初始化.有没有更好的方法来初始化我的静态成员?
谢谢!
我遇到了这个 QCoreApplication 问题,其中在 QObject 在 QThread 内完成执行后调用 input() 会导致无限循环打印到控制台“QCoreApplication::exec: 事件循环已在运行”。
在代码中,我创建了一个通用worker作为QObject,将其移动到QThread中(使用QThread的认可方式,而不是子类化它),然后在通用worker内执行另一个QObject(主类)函数。只要我在执行 Master 后不调用 input() ,一切就可以正常工作。请注意,如果我直接在工作线程中执行函数(而不是主实例的函数),也会出现问题。
这是重现该问题的示例代码:
import sys
from PyQt4.QtCore import QCoreApplication, QObject, QThread, pyqtSignal, pyqtSlot
class Worker(QObject):
"""
Generic worker.
"""
start = pyqtSignal(str)
finished = pyqtSignal()
def __init__(self, function):
QObject.__init__(self)
self._function = function
self.start.connect(self.run)
def run(self):
self._function()
self.finished.emit()
class Master(QObject):
"""
An object that will use the worker class.
"""
finished = pyqtSignal()
def __init__(self):
QObject.__init__(self)
@pyqtSlot()
def do(self):
print("Do what?")
self.finished.emit()
def done():
# FIXME This will …Run Code Online (Sandbox Code Playgroud)