Qt 5.5.0
我正在将我的一个 gui 应用程序切换到控制台。我在控制台模式下启动 QSettings 对象时遇到问题。
这是gui中的代码,它工作正常:
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
MainWindow();
QSettings *Setts; //settigns
...
}
MainWindow::MainWindow()
{
QFile setfile("./SA/Settings.ini");
if (setfile.exists())
setfile.setPermissions(setfile.permissions() | QFileDevice::ReadUser | QFileDevice::WriteUser);
Setts = new QSettings("./SA/Settings.ini", QSettings::IniFormat);
setfile.setFileName(Setts->value("Localization","./SA/en.loc").toString());
...
}
int main(int argc, char *argv[])
{
QPointer<QApplication> app;
QPointer<MainWindow> main_window;
app = new QApplication(argc, argv);
main_window = new MainWindow();
...
}
这是控制台的代码
class MainWindow : public QObject
{
Q_OBJECT
public:
MainWindow();
~MainWindow();
QSettings *Setts; //settigns
...
}
MainWindow::MainWindow()
{
QFile setfile("./SA/Settings.ini");
if (setfile.exists())
setfile.setPermissions(setfile.permissions() | QFileDevice::ReadUser | QFileDevice::WriteUser);
Setts = new QSettings("./SA/Settings.ini", QSettings::IniFormat);
setfile.setFileName(Setts->value("Localization",QString("./SA/en.loc")).toString());
...
}
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
MainWindow mw;
...
}
控制台代码在调用 Setts->value 时失败,并出现错误:QVariant 中的 ASSERT 失败:“尝试构造未知类型”,文件 kernel\qvariant.cpp,第 980 行。
在调试时,我在输入类构造函数时注意到警告:找不到“QSettings”值的虚拟表的链接器符号。
我尝试了多种方法,尽管文件存在,但 QSettings 不会在其构造函数中初始化值。调用 Setts->contains("Localization") 也会给出同样的错误。但是如果我在构造函数之后使用 Setts->setValue,它工作正常。我该怎么做才能使 QSettings 在构造函数中初始化?
设置.ini
[General]
geometry="@ByteArray(\x1\xd9\xd0\xcb\0\x2\0\0\0\0\aw\xff\xff\xff\xf7\0\0\xf\b\0\0\x4\x10\0\0\bn\0\0\0\x43\0\0\f\x8c\0\0\x4;\0\0\0\x1\x2\0\0\0\a\x80)"
Localization=./SA/ru.loc
LOCALE=Windows-1251
CONSOLELOCALE=csIBM866
LOGFILE=./SA/log.txt
SETNUMBER=basic
COMPORT=COM1
STATUS=false
CONSOLE=true
FILE=false
TIME=true
DIRECTION=true
FONTDATA=@Variant(\0\0\0@\0\0\0\x1c\0M\0S\0 \0S\0h\0\x65\0l\0l\0 \0\x44\0l\0g\0 \0\x32@ \0\0\0\0\0\0\xff\xff\xff\xff\x5\x1\0\x32\x10)
MONOFONTDATA=@Variant(\0\0\0@\0\0\0\x10\0\x43\0o\0n\0s\0o\0l\0\x61\0s@ \0\0\0\0\0\0\xff\xff\xff\xff\x5\x1\0\x32\x10)
AUTOCLEAR=true
AUTODETAILS=true
ACKTIMEOUT=5
NAKTIMEOUT=2
MSGTIMEOUT=45