【问题标题】:Qt console application "WARNING: QApplication was not created in the main() thread"Qt 控制台应用程序“警告:未在 main() 线程中创建 QApplication”
【发布时间】:2014-01-12 17:20:16
【问题描述】:

我正在根据此处给出的堆栈溢出示例创建一个非常简单的 C++ QT 控制台应用程序。

How to use QFileSystemWatcher to monitor a folder for change

代码与该应用程序中的代码完全相同,我正在使用 Qt 的 UI、带有 MinGW 32 位的 Qt Creator 进行开发。我从可以选择的项目中选择了控制台应用程序,因为我不需要图形用户界面。应用程序完成加载后,应用程序会显示错误消息“警告:未在 main() 线程中创建 QApplication”,然后什么也不做。

我已尝试调试应用程序,但没有遇到断点,我认为在编辑器中无法进行调试。

我快速将 QApplication 更改为 QCoreApplication,因为我正在开发控制台应用程序,但收到完全相同的错误消息。

文件系统接收器.h

#ifndef FILESYSTEMRECEIVER_H
#define FILESYSTEMRECEIVER_H

#include <iostream>

using namespace std;

#include <QtCore/QApplication>
#include <QtCore/QFileSystemWatcher>
#include <QtCore/QDebug>
#include <QtWidgets/QWidget>
#include <QtWidgets/QMessageBox>

class MyClass : public QWidget
{
    Q_OBJECT
public:
    MyClass(QWidget* parent=0)
        :QWidget(parent){}

    ~MyClass() {}
public slots:
    void showModified(const QString& str)
    {
        Q_UNUSED(str)
        cout << "A message has been received!" << endl;
        //QMessageBox::information(this,"Directory Modified", "Your Directory is modified");
    }
};

#endif // FILESYSTEMRECEIVER_H

main.cpp

#include <iostream>

using namespace std;

#include <QtCore/QApplication>
#include <QtCore/QFileSystemWatcher>
#include <QtCore/QDebug>
#include <QtWidgets/QWidget>
#include <QtWidgets/QMessageBox>

#include "fileSystemReceiver.h"

int main(int argc, char* argv[])
{
    QApplication app(argc, argv);
    QFileSystemWatcher watcher;
    watcher.addPath("C:/QtTest");

    QStringList directoryList = watcher.directories();
    Q_FOREACH(QString directory, directoryList)
              qDebug() << "Directory name" << directory <<"\n";

    MyClass* mc = new MyClass;

    QObject::connect(&watcher, SIGNAL(directoryChanged(QString)), mc, SLOT(showModified(QString)));

    return app.exec();
}

我的 pro 文件如下所示:

QT       += core
QT       += widgets

QT       -= gui

TARGET   =  fsw
CONFIG   += console
CONFIG   -= app_bundle

TEMPLATE = app

HEADERS += fileSystemReceiver.h

SOURCES  += \
    main.cpp

【问题讨论】:

  • 因为没有代码所以不清楚你在问什么
  • 代码在链接中。
  • 关于 Qt 的一个不明显的事情是,您需要在执行任何其他操作之前创建一个 QApplication 对象,即使您不直接访问此对象。听起来这就是您的代码中缺少的内容。
  • 这就是代码显然所做的,我将尝试使 QApplication 全局化,看看是否会有所作为。 - 不
  • 问题需要独立。将您的代码放在这里并删除链接。

标签: c++ qt qt-creator qmake qtgui


【解决方案1】:

您在项目中遇到了几个问题:

  • 应该显示 QWidget 的程序中的 QCoreApplication

  • 调用 main.cpp 源文件 main.moc。这表明您不太了解 moc 的工作原理以及它的含义。

  • cout 在 Qt 程序中,而不是 QTextStream 或 qDebug()。

  • 源代码中的 Q_FOREACH 未被其他应用程序重用,因此通常不会发生冲突。你应该简单地使用“foreach”。

  • 在使用 foreach 进行迭代时,您没有对字符串使用 const 引用,即使您似乎只是在阅读它,而不是在修改它。

  • 您在此处有硬编码路径,而不是位于分隔良好的位置的 const 字符串:watcher.addPath("C:/QtTest");

  • 您将 widgets 添加到 CONFIG 变量中,但您删除了 gui

  • 默认情况下,您将 `core 添加到 CONFIG 变量中。

  • 您包含 #include &lt;QtWidgets/QFoo&gt; 而不是 #include &lt;QFoo&gt; 以保留使用 Qt 4 构建的选项,并且通常具有明确的构建系统包含路径。

  • 您正在为非控制台应用程序添加CONFIG += console

  • 您正在为非控制台应用程序添加CONFIG -= app_bundle

  • 您对 SOURCES 变量使用反斜杠,但对 HEADERS 没有。这是不一致的。

  • 您在堆上创建一个 MyClass 实例,而不是在堆栈上,以使其更简单,因为它已被事件循环正确保护,以在预期范围内保持有效。

最重要的是,根据评论讨论,您的问题似乎与 qDebug() 有关。您应该按照以下文档正确设置 QtCreator 以进行调试。

Setting Up Debugger

【讨论】:

  • Note Laszlo 这是一个回答问题的地方,而不是对代码的批评。请记住,代码是对链接中代码的修改。如果您有很多问题,我建议您看看那里,谢谢,无论如何,请提供帮助。
  • @ceorron:如果您在此处粘贴代码,请期望某些人会花费他们的空闲时间来尽可能地帮助您。我的回答也涵盖了解决方案,还有进一步改进的空间。请不要将其视为个人或负面的。我们来这里是为了改善事情,不是吗? :-)
  • 是的,我们来这里是为了改进事情,很高兴您能抽出时间,我会做出这些改变。谢谢你。我只是想说,一般来说堆栈溢出是为了回答而不是批评。
  • @ceorron:这是我的回答。在修复问题的同时清理你的代码,因为这样它就可以工作了。如果没有干净的软件,就很难检测到这些问题。
  • +1 给 Laszlo 以获得全面的代码评论。里面有很多有用的东西。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-03-09
  • 1970-01-01
  • 2018-12-06
  • 1970-01-01
  • 2011-09-08
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多