访问QApplication :: arguments

时间:2016-02-23 00:12:22

标签: c++ qt qt5 qt5.5

在为gui编写包含qt的程序时,我偶然发现了一个问题,可以使用下面的最小代码复制:

#include <iostream>
#include <QApplication>
#include <QSettings>

using namespace std;

int main(int argc, char ** argv) {
    QApplication *app;
    {
        int tmp_argc = argc;
        app = new QApplication(tmp_argc, argv);
    }
    QSettings settings("testvendor");
    cout<<"Num of arguments: "<<app->arguments().count()<<std::endl;
    return 0;
}

在核心转储(在调用QApplication :: arguments中)或Num of arguments: 0中运行结果,这显然是错误的。

如果我使用app实例化app = new QApplication(argc, argv)(使用带有参数计数的未编码变量)或删除settings的声明/定义 - 程序按预期输出Num of arguments: 1 (这些变化中的任何一个都足够了。)

我在Qt 5.5上使用Ubuntu,项目基于cmakeCMakeLists.txt的内容:

cmake_minimum_required(VERSION 3.3)
project(qtest)

set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11")

set(CMAKE_PREFIX_PATH /opt/Qt/6.5.1/gcc_64/)
find_package(Qt5Widgets REQUIRED)

set(SOURCE_FILES main.cpp)
add_executable(qtest ${SOURCE_FILES})
target_link_libraries(qtest Qt5::Widgets)

2 个答案:

答案 0 :(得分:4)

  

警告: argc 和argv 引用的数据必须在QApplication对象的整个生命周期内保持有效。此外,argc必须大于零,并且argv必须至少包含一个有效的字符串。“

From QT 5 Documentation。强调我的。

tmp_argc超出了范围。

QApplication *app;
{
    int tmp_argc = argc;
    app = new QApplication(tmp_argc, argv);
} <-- BOOM!

答案 1 :(得分:1)

以下是如何修复它,符合QCoreApplication构造函数文档中给出的要求:

// https://github.com/KubaO/stackoverflown/tree/master/questions/app-args-35566459
#include <QtCore>
#include <memory>

std::unique_ptr<QCoreApplication> newApp(int & argc, char ** argv) {
   return std::unique_ptr<QCoreApplication>(new QCoreApplication{argc, argv});
}

int main(int argc, char ** argv) {
    std::unique_ptr<QCoreApplication> app(newApp(argc, argv));
    QSettings settings{"testvendor"};
    qDebug() << "Num of arguments: " << app->arguments().count();
}