Просмотр сообщений
|
Страниц: 1 ... 81 82 [83] 84 85 ... 96
|
1231
|
Qt / Общие вопросы / Re: Помогите пожалуйста наладить перехват stdout консольного приложения.
|
: Июль 02, 2010, 14:35
|
я бы дал идею не просто создать процесс-перехватчик запуском одного QProcess, а запустить второй QThread, в нем запускать QProcess, получать там данные дочернего приложения, и через BlockingQueuedConnection передавать в QTextEdit основной нити - так интерфейс гарантированно блокироваться не будет у меня в приложении похожим образом работает "консоль" - основные действия выполняются фоновым QThread, из которого через блокирующее соединение вычислитель плюется сообщениями, и эти сообщения валятся в QTextEdit в основном треде только вот QTextEdit при этом все сильно тормозит, он на добавлении строк медлееееееннннннныыыыыыййййй..... поэтому при полностью асинхронной работе дочернего приложения вполне возможна потеря части сообщений
|
|
|
1234
|
Qt / Общие вопросы / Re: запись QSettings в INI создает 2 ключа, так и должно быть?
|
: Июнь 30, 2010, 08:23
|
Все, исправил... в коде загрузки настроек были пустые пары begin-end и это влияло на запись, поэтому первоначально создавался правильный файл, а если он уже был, то после загрузки настроек все ломалось ИМХО еще раз - механизм QSettings реализован угребищный, можно было бы сделать гораздо удобнее и надежнее в использовании. а чтобы не было больше такой ситуации, переделал класс Settings "не по Шлее", сделал 1 метод записи-чтения настроек, чтобы структура задавалась 1 раз void Settings::settingsSaveRestore( bool save ) { if( save ) setValue("SettingsDefined", true ); beginGroup( "ViewSettings" ); { beginGroup( "MainText" ); { beginGroup( "FontsAndColors" ); { if( save ) { setValue(....); ...... } else { var = value(....).value<QColor>(); .... } } endGroup(); // FontsAndColors
//beginGroup( "DistanciesAndSizes" ); //endGroup(); // DistanciesAndSizes
beginGroup( "OtherSettings" ); { if( save ) { setValue(....); .... } else { value = value(....).toInt(); .... } } endGroup(); // OtherSettings } endGroup(); // MainText
//beginGroup( "ConsoleText" ); { //beginGroup( "FontsAndColors" ); //endGroup(); // FontsAndColors
//beginGroup( "OtherSettings" ); //endGroup(); //OtherSettings } //endGroup(); // ConsoleText
//beginGroup( "SelectAndViewWins" ); //endGroup(); // SelectAndViewWins } endGroup(); // ViewSettings
beginGroup( "ShellSettings" ); { if( save ) { setValue("MRUlist", MRUlist ); } else { MRUlist = value("MRUlist").toStringList(); } } endGroup(); //ShellSettings if( save ) sync(); }
соответственно, конструктор этого класса Settings::Settings() : QSettings( "settings.ini", QSettings::IniFormat ) { if( !value( "SettingsDefined" ).toBool() ) { // файл только что создан, установки не определены, заполняются умолчательными значениями resetDefaultSettings(); settingsSaveRestore( true ); } else // установки загружены из файла settingsSaveRestore( false ); } рекомендация в Шлее наихудшая
|
|
|
1237
|
Qt / Общие вопросы / Re: запись QSettings в INI создает 2 ключа, так и должно быть?
|
: Июнь 29, 2010, 20:01
|
В вашей задаче смысл с ним мучаться есть? да, есть, требование портабельности + работа без инсталляции весь код показывай какой именно? который убран из кода выше? там только строки setValue(), больше ничего есть еще код загрузки из настроечного файла, там могли оказаться непарные begin-end, хотя маловероятно, и если они в самом деле есть, то точно есть косяк в QSettings, из-за которого загрузка из файла ломает его последующую запись имхо, эта модель с begin-end - ущербная, и плохо продуманная я сначала подумал, что можно унаследовать QSetiings, и в классе-наследнике "сообщить" классу-родителю, какие данные надо сохранять и загружать при выполнении sync(), имхо это было бы правильно, но оказалось не так, а гораздо примитивнее
|
|
|
1238
|
Qt / Общие вопросы / Re: запись QSettings в INI создает 2 ключа, так и должно быть?
|
: Июнь 29, 2010, 15:52
|
ХОТЯ НЕТ! ВРУ!!! Первый раз создается правильный файл установок. Но при перезаписи получается опять двоение... Причем при загрузке настроек, они читаются ТОЛЬКО из длинных ключей, то есть, при загрузке правильного созданного в первый раз файла настроек, содержимое MRUlist не восстанавливается
|
|
|
1240
|
Qt / Общие вопросы / Re: запись QSettings в INI создает 2 ключа, так и должно быть?
|
: Июнь 29, 2010, 15:43
|
[General] SettingsDefined=true
[ViewSettings] ProgramText\FontsAndColors\<несколько записей> ProgramText\OtherSettings\<несколько записей> SettingsDefined=true ViewSettings\ProgramText\FontsAndColors\<несколько записей, столько же и такие же, как в предыдущем ключе> ShellSettings\MRUlist=<список через запятые>
[ShellSettings] MRUlist=@Invalid()
может собака порылась в том, что у меня есть пустые группы только из begin/end?
|
|
|
1241
|
Qt / Общие вопросы / Re: запись QSettings в INI создает 2 ключа, так и должно быть?
|
: Июнь 29, 2010, 15:34
|
нет, не напоминает я же ясно написал - первый раз ключ создается с пустым списком QStringList, в результате появляется запись с Invalid внутри группы второй раз тот же самый код создает запись с непустым списком, который записывается, как длинный ключ, а в группу ничего не добавляется если есть сомнения в моей внимательности или желание поупражняться в проверке баланса begin/end, то вот пожалуйста код функции, пишущей группы, убраны только коды записи отдельных ключей void Settings::recordSettings() { setValue("SettingsDefined", true ); beginGroup( "ViewSettings" );
beginGroup( "MainText" );
beginGroup( "FontsAndColors" ); endGroup(); // FontsAndColors
beginGroup( "DistanciesAndSizes" ); endGroup(); // DistanciesAndSizes
beginGroup( "OtherSettings" ); endGroup(); // OtherSettings
endGroup(); // MainText
beginGroup( "ConsoleText" );
beginGroup( "FontsAndColors" ); endGroup(); // FontsAndColors
beginGroup( "OtherSettings" ); endGroup(); //OtherSettings
endGroup(); // ConsoleText
beginGroup( "SelectAndView" ); endGroup(); // SelectAndView
endGroup(); // ViewSettings
beginGroup( "ShellSettings" ); setValue("MRUlist", MRUlist ); endGroup(); //ShellSettings
sync(); }
|
|
|
1243
|
Qt / Общие вопросы / запись QSettings в INI создает 2 ключа, так и должно быть?
|
: Июнь 29, 2010, 14:44
|
первый раз пишется объект, наследующий QSettings, записывается пустой QStringList, причем его по идее нельзя ничем заполнять, запись выполняется таким образом: beginGroup( "ShellSettings" ); setValue("MRUlist", MRUlist ); endGroup();
в файле появляется запись [ShellSettings] MRUlist=@Invalid()
после добавления хотя бы одного имени в MRU list, он снова сохраняется точно тем же кодом, но в файле остается предыдущая запись и появляется совершенно отдельный ключ, не входящий в сегмент [ShellSettings], но входящий в предыдущий сегмент (в моем случае это [ViewSettings], ключ выглядит таким образом: ShellSettings\MRUlist=<полное имя файла>
далее при добавлении файлов в список, они добавляются в этот ключ, а предыдущий созданный инвалид остается на месте что не есть правильно, хотя ключ восстанавливается вроде бы верно, и при старте приложение получает список предыдущих открытых файлов баг??
|
|
|
1245
|
Qt / Общие вопросы / Re: можно ли записать QStringList в QSettings одним махом?
|
: Июнь 29, 2010, 13:09
|
в классе Settings::QSettings написано в конструкторе Settings::Settings setValue("MRUlist", MRUlist );
MRUlist заполняется из менюшки, которая содержит предыдущие открытые файлы settings->MRUlist.clear(); foreach( QAction* action, MRUmenu->actions() ) settings->MRUlist << action->text(); settings->sync();
перед вызовом settings->sync(); точка останова, смотрю settings->MRUlist там все правильно, массив строк с именами предыдущих открытых файлов но после синхронизации смотрю в файл настроек, там подумал, может быть нельзя пустой QStringList в начале передавать, написал ему MRUlist << "" в конструкторе в результате в файл записалась одна пустая строка, которая там никак не изменяется, независимо от количества строк в settings->MRUlist перед вызовом sync(), ну и разумеется появляется пустой пункт в MRU при загрузке такого списка после старта приложения при этом все остальные настройки, которые дискретно записываются (цвета, шрифты, разные параметры) - все давно нормально сохраняется что не так с MRUlist, почему не записывается при выполнении sync()?
|
|
|
|
|