Есть ли готовый к использованию диалог настроек? - PullRequest
1 голос
/ 01 марта 2012

Вот идея: у меня есть список параметров (имя, тип, значение, может быть, что-то большее - регулярное выражение для ввода), сгруппированных по разделам. Они хранятся в xml-файле (например ... возможно, в другом формате). Я хочу сделать модуль, который строит «стандартный» диалог настроек, опираясь на этот файл. Как это settings Имена разделов должны быть слева в виде списка, а параметры, связанные с выбранным разделом, справа: имя в качестве метки и значение в качестве некоторого поля ввода, тип которого зависит от типа параметра (lineEdit для текста, spinEdit - для чисел , checkBox - для логических значений и т. д.) Напоследок вопрос: есть ли готовый к использованию диалог для моих целей? Спасибо.

Ответы [ 2 ]

0 голосов
/ 12 марта 2012

Я искал некоторое время и не нашел никакого решения. Вот почему я решил написать это сам. Вот небольшое описание:

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>

вот картинка enter image description here

и вот использование 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/

0 голосов
/ 01 марта 2012

Нет такого диалога.

Как насчет создания «полного» диалога вручную, а затем отключения / скрытия элементов, которые не используются в конкретном случае?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...