Я искал некоторое время и не нашел никакого решения. Вот почему я решил написать это сам.
Вот небольшое описание:
1 Основная концепция
Если ваша программа имеет некоторые параметры, которые вы хотите редактировать из графического интерфейса, вам просто нужно написать xml-файл в правильном формате, создать экземпляр класса Config, вызвать слот Config :: show () и, наконец, запросить необходимый параметр через Config :: get ()
2 Использование класса Config
Вы можете создать его где угодно. Вы можете дать имя / путь к xml-файлу либо в c-tor, либо в методе Config :: load (). Вы можете получить любой параметр в любом месте вашей программы,
вызов метода Config :: get (). Пример использования класса Config:
Config config( "full/path/to/settings.xml" );
connect( settingsAction, SIGNAL( trigger() ), &config, SLOT( show() ) );
...
if ( config.get( "section_name", "param_name" ).toBool() ) {
...
}
QFile file( config.get( "section_name", "directory_for_log" ).toString() +
"/prog.log" );
3 ограничения
Для настройки требуются QtCore, QtGui и QtXml. Он использует возможности C ++ 11.
4 Xml-формат файла
Извините, но мне лень писать полное описание, поэтому я напишу полный пример со всеми функциями. Я думаю, что вы все их поймете:)
<?xml version="1.0" encoding="System"?>
<config>
<section visible="true" name="First section name">
<group visible="true" checkable="true" checked="true" name="First group">
<value visible="true" type="text" value="192.168.1.1:1234" regexp="ip-addr:port" name="Ip address:port"/>
<value visible="true" type="bool" value="false" name="Some bool value"/>
<value visible="true" type="combo" value="Just three" items="The one;The two;Just three" name="Choose 1"/>
<value visible="true" type="file" value="/etc/some/file.jpg" name="Picture or sound" filters="Images (*.png *.jpg);;Sounds (*.mp3 *.wav)"/>
<value visible="true" type="radio" value="Fourth" items="First;Second;Third;Fourth" name="Choose 2"/>
<value visible="true" type="dir" value="/etc" name="Dir for log"/>
</group>
<group visible="true" checkable="false" checked="true" name="Second group">
<value unit=" cm" visible="true" type="int" value="18" min="1" name="Length" max="33"/>
<value unit=" kg" visible="true" type="int" value="42" min="0" name="Weight" max="100"/>
</group>
<value visible="true" type="bool" value="true" name="Just bool"/>
</section>
<section visible="true" name="Second sect">
<value visible="true" type="text" value="hello" regexp="(hello)+" name="Greet me"/>
<value visible="false" type="bool" value="true" name="Invisible bool"/>
</section>
</config>
вот картинка
и вот использование Config с этим файлом
std::ostream & operator<< ( std::ostream & os, const QVariant & var ) {
if ( var.type() == QVariant::Bool ) {
os << var.toBool();
}
else if ( var.type() == QVariant::Int ) {
os << var.toInt();
}
else if ( var.type() == QVariant::String ) {
os << qPrintable( var.toString() );
}
return os; }
cout << "First group checked : " << cfg.get( "First section name", "First group" ) << endl;
cout << "Ip address:port : " << cfg.get( "First section name", "Ip address:port" ) << endl;
cout << "Some bool value : " << cfg.get( "First section name", "Some bool value" ) << endl;
cout << "Choose 1 : " << cfg.get( "First section name", "Choose 1" ) << endl;
cout << "Picture or sound : " << cfg.get( "First section name", "Picture or sound" ) << endl;
cout << "Choose 2 : " << cfg.get( "First section name", "Choose 2" ) << endl;
cout << "Dir for log : " << cfg.get( "First section name", "Dir for log" ) << endl;
cout << "Length : " << cfg.get( "First section name", "Length" ) << endl;
cout << "Weight : " << cfg.get( "First section name", "Weight" ) << endl;
cout << "Just bool : " << cfg.get( "First section name", "Just bool" ) << endl;
cout << "Greet me : " << cfg.get( "Second sect", "Greet me" ) << endl;
cout << "Invisible bool : " << cfg.get( "Second sect", "Invisible bool" ) << endl;
И, наконец, можете ли вы сказать мне лучший способ публикации исходного кода?
Спасибо.
UPD: Вы можете найти его здесь https://sourceforge.net/projects/guisettings/