【发布时间】:2016-06-04 15:15:49
【问题描述】:
在为 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 = new QApplication(argc, argv) 实例化app(使用带有参数计数的无作用域变量)或删除settings 的声明/定义 - 程序按预期输出Num of arguments: 1(其中任何一项更改就足够了)。
我在Ubuntu上使用Qt 5.5,项目是基于cmake的,CMakeLists.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)
【问题讨论】: