Russian Qt Forum
Апрель 19, 2024, 03:40 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало Форум WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  
  Просмотр сообщений
Страниц: 1 ... 83 84 [85] 86 87 ... 96
1261  Qt / Пользовательский интерфейс (GUI) / Re: автоматизировать связи changed*() РЕШЕНО : Июнь 16, 2010, 17:02
Цитировать
Например, можно было каждому объекту (виджету), который должен участвовать в проверке, добавить свойство.

ой мама... это же что получилось бы? Шокированный свойство добавлять руками?? тогда в чем глубокий смысл всего этого??? получилось бы еще хуже - добавился виджет, и к нему надо еще дописать хренов код для добавления ему свойства... Обеспокоенный

а если не руками, то... как определять автоматом какому виджету надо его добавить?Непонимающий  Смеющийся

а сейчас я уже переделал на цикл по массивам, и при добавлении виджета единственное что надо сделать - если на диалоге еще не было такого класса виджетов, то его имя класса надо вписать в конец массива char*, а в конец другого массива char* вписать имя сигнала об изменении, И ВСЕ!
1262  Qt / Пользовательский интерфейс (GUI) / Re: автоматизировать связи changed*() : Июнь 16, 2010, 12:43
Цитировать
вроде в документации написано:

пардон, и правда написано... Улыбающийся

а задача решена! работает!  Смеющийся

кусочек конструктора диалога настроек
Код:
QWidget* widget;
QList<QWidget*> widgets = findChildren<QWidget*>();
foreach( widget, widgets )
{
if (widget->inherits("QCheckBox"))
connect(widget, SIGNAL(stateChanged(int)), this, SLOT(slChanged()));
else if (widget->inherits("QComboBox"))
connect(widget, SIGNAL(currentIndexChanged(int)), this, SLOT(slChanged()));
else if (widget->inherits("QtColorPicker"))
connect(widget, SIGNAL(colorChanged(const QColor &)), this, SLOT(slChanged()));
}

причем последний виджет не из комплекта Qt, добавлен отдельно

надо только вынести в отдельный массив список имен виджетов, и список имен их changed() сигналов, чтобы при необходимости просто добавлять туда новые, и больше никакой код не переписывать

кстати, совет добавить туда Q_ASSERT_X не годится - findChildren оббегает все виджеты, причем рекурсивно, а кроме активных селекторов на диалоге находятся еще пассивные метки и полуактивные программно изменяемые нередактируемые строки (например, сэмпл текста с разными подсветками) - поэтому в if-ах должны быть только те классы, которые точно будут генерить сигнал изменения

Цитировать
Пример: есть список нескольких экземпляров объектов одного типа. Данные показываются/редактируются в немодальном окне. Выбрали из списка один экземпляр - его данные в окне. Выбрали другой - его. Что будете делать если завязались на QSettings?

а давайте без оффтопика...

впрочем, отвечу - редактирование и сохранение данных объектов и редактирование и сохранение настроек приложения - суть разные вещи, и делаются по-разному, хотя, впрочем, в QSettings можно и первое запузырить, если кончено, объекты несложные, поскольку Qsettings - это интерфейс к системно-независимой простейшей иерархической базе данных...

создайте отдельную ветку, если интересно дальше это обсуждать
1263  Qt / Пользовательский интерфейс (GUI) / Re: автоматизировать связи changed*() : Июнь 16, 2010, 10:31
Цитировать
Или я не понял суть вопроса?

именно

собственно решение уже фактически найдено, надо только реализовать его, руки дойдут сделаю

а реестр идет лесом, у Qt надо пользоваться QSettings

BTW: кто знает, можно ли корректно (без хаков с #define) на винде QSettings перенастроить так, чтобы не в реестр писало, а в INI файл, чтобы настройки сохранялись в каталоге приложения (чтобы оно работало без инсталляции, с флешки)?
1264  Qt / Пользовательский интерфейс (GUI) / Re: автоматизировать связи changed*() : Июнь 15, 2010, 21:52
ну влоб их способ не годится - там описан метод add() который добавляет контролы, а у меня они в дизайнере рисуются

а вот widget->inherits( <имя класса> ) и подключение сигнала изменения этого класса - похоже на то, что надо, можно пробежать по всем виджетам настроек, и аналогичным образом их подключить

надо только не забывать добавлять соответствующую проверку имени класса, если будет использоваться контрол, наследующий какой-нибудь класс, который еще не включен в проверки
1265  Qt / Пользовательский интерфейс (GUI) / Re: автоматизировать связи changed*() : Июнь 15, 2010, 20:49
все равно в таблицу надо руками добавлять, и не попутать dataType и ctrlType, хочется чисто динамически, поскольку диалог настроек полностью рисуется в Дизайнере

хватает только написания кода для передачи всех настроек из класса Settings::QSettings и обратно... но там хоть запутаться сложно, хотя пропустить что-нибудь, как нефик делать

просто контролов в настройках очень много

че-то не вижу я, как получить список слотов КуОбъекта, наверняка есть, но не туда смотрю
1266  Qt / Пользовательский интерфейс (GUI) / Re: автоматизировать связи changed*() : Июнь 15, 2010, 17:14
Цитировать
Копайте QObject::property() и QVariant().

вот-вот-вот... истина где-то рядом... (С) Малдер

если бы property() понимал сложный запрос с wildcard типа property( "*Changed(*" - можно было бы просто запросить каждый контрол... хотя наверно можно через metaObject получить все сигналы, и QRegExp-ом отобрать нужные

кто-нибудь делал? все получается?
1267  Qt / Пользовательский интерфейс (GUI) / Re: автоматизировать связи changed*() : Июнь 15, 2010, 11:07
Цитировать
Вы меня не поняли. Я говорил про другое.
Зачем менять содержимое сигнала? Нужно правильно описать сигнал и повесить на него один общий слот:

я то как раз понял, поскольку так и предполагал сделать, но вы меня не поняли... Улыбающийся

я могу написать несколько десятков строк с connect, но стараюсь от этого избавиться, поскольку при добавлении или удалении контролов надо добавлять или удалять соответствующие им connect-ы, и вообще в нескольких десятках контролов нетрудно запутаться, что-то потерять и т.д. - я говорю о решении, которое бы подключало ВСЕ контролы диалога, независимо от их числа и типа

Цитировать
Во время создания диалога в свойствах контрола сохраните его значение. В accept() пробежитесь по всем контролам и сравните текущее с сохраненным. Всё просто

с точки зрения количества подключений и вероятности ошибки это практически тоже самое, что подключить все контролы к одному слоту построчно, поскольку функции получения значения контрола у всех типов контролов разные, и возвращают разные типы данных, значит их нельзя просто пробежать в цикле foreach( control, controlList )
1268  Qt / Пользовательский интерфейс (GUI) / Re: автоматизировать связи changed*() : Июнь 15, 2010, 10:16
можно конечно и один слот changed() сделать, но это ничего не меняет по существу - все контролы все равно нужно будет по отдельности подключать, поскольку нельзя написать SIGNAL(colorChanged()) если он colorChanged(QColor), подключение просто не выполнится, и регулярный механизм для гомогенного подключения сигналов QtColorPicker::colorChanged(QColor) и QComboBox::currentIndexChanged(int) тут не просматривается

а QSignalMapper наверно было бы то, что надо, но в другой реализации - а так все равно надо руками его подключать ко всем контролам, нет разницы, также точно можно и без QSignalMapper просто один слот в классе диалога создать

вот если бы родительские классы для разных контролов имели некий общий сигнал changed(), который выдается, если объект изменился, независимо от его структуры... например, у QWidget если бы такой сигнал был, или даже у QObject... то есть, сигналы changed*() у дочерних классов все равно остаются, но обязательно вызывают этот сигнал у своего родителя - тогда все элементарно бы получалось и автоматизировалось, я бы в цикле по всем контролам пробежал и их подключил, и дальше можно добавлять или удалять контролы, они бы автоматом подключались, но поскольку у их changed*() разные имена и параметры, так не получается  Грустный
1269  Qt / Пользовательский интерфейс (GUI) / автоматизировать связи changed*() РЕШЕНО : Июнь 15, 2010, 08:56
есть многостраничный диалог настроек с десятками контролов, надо собрать с них всех сигналы changed*(), чтобы знать, когда надо копировать настройки при закрытии диалога, когда не надо (можно, конечно, по Ок переписывать всегда, а по Cancel всегда хренить, но как-то это не очень нравится, тем более, что надо по Cancel выдать предупреждение, если настройки были изменены)

а эти changed*() Тролли умудрились сделать очень разнообразными, где-то параметр int, где-то другой...

и теперь грустно, что придется руками писать, кроме копирования настроек, еще и различные слоты, к которым changed*() должны быть присоединены, и в конструкторе диалога настроек еще все это соединять, и не забыть, и не пропустить ничего, а контролов... десятки...

может есть какой-то автоматизированный способ это все отследить? я его в документации не вижу, может кто делал уже, подскажет?
1270  Qt / Qt-инструментарий / Re: в КуДизайнере можно открыть ветки Tree Widget? : Июнь 15, 2010, 08:32
да вызвал, разумеется, хотя по идее, это могло бы быть флагом при создании дерева, чтобы только в дизайнере галку установить
1271  Qt / Пользовательский интерфейс (GUI) / Re: кнопка Apply не работает в ButtonBox : Июнь 12, 2010, 17:43
угу, когда мало чего прописывать, можно и вручную, но когда только на странице настроек цветов 20 контролов, а страниц настроек полтора десятка...
1272  Qt / Пользовательский интерфейс (GUI) / Re: QtColorPicker кто-нибудь пользовался : Июнь 10, 2010, 13:28
а вот нет у меня такого ярлыка, и группы tools...

нашел designer.exe в qt/bin, запустил... фуфф... появился плагин колорпикер...

опять запутали... зачем нужен дизайнер на vc, если я работаю с mingw, и почему нельзя запускать в креаторе дизайнер на mingw?...
1273  Qt / Пользовательский интерфейс (GUI) / Re: QtColorPicker кто-нибудь пользовался : Июнь 10, 2010, 13:13
млин, а где написано какой дизайнер где собран, и где лежит внешний, который собран mingw и откуда видно, для какого дизайнера какой плагин надо чем собирать???...

я потому и задаю здесь вопросы, что нигде нифига это не описано, а я спотыкаюсь там, где должен был бы легко

ну разумеется, vcproj в XML формате должен быть, а qmake нагенерил... обычный Makefile
1274  Qt / Пользовательский интерфейс (GUI) / Re: QtColorPicker кто-нибудь пользовался : Июнь 10, 2010, 13:11
не работает это... студия ругается, что созданный vcproj файл предназначен для предыдущей версии, пытается конвертировать и ругается, что не конвертируется

Цитировать
The following error has occurred during XML parsing: File: C:\Qt\2009.03\qt\addons\qtcolorpicker-2.6_1-opensource\plugin\plugin.vcproj Line: 1 Column: 1 Error Message: Incorrect document syntax. The file 'C:\Qt\2009.03\qt\addons\qtcolorpicker-2.6_1-opensource\plugin\plugin.vcproj' has failed to load.
Project upgrade failed.
1275  Qt / Пользовательский интерфейс (GUI) / Re: QtColorPicker кто-нибудь пользовался : Июнь 10, 2010, 12:57
а настройки в студии какие должны быть - компилятора, компоновщика?

Тролли могли бы и файл проекта для студии положить...
Страниц: 1 ... 83 84 [85] 86 87 ... 96

Страница сгенерирована за 0.057 секунд. Запросов: 24.