Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Свойства QComboBox-мембера в дизайнере
Форум на CrossPlatform.RU > Библиотеки > Qt > Qt инструментарий
Алексей1153
если в дизайнере положить на форму элемент QComboBox, то его содержимое можно настроить правой кнопкой -> изменить элементы. Так вот, имеется некий класс контрола

class A : QObject 
{
   ....
  
    QComboBox* m_CBX;
};


контрол добавлен в дизайнер, на нём виден дочерний комбобокс

Как сделать так, чтобы щелчком по контролу A можно было бы выбрать тот самый пункт меню с настройкой комбобокса (то есть нужна полная аналогия настройки содержимого одиночного QComboBox )
Алексей1153
неужели никак ? :(
PAFOS
Есть одна идея, но придется реализовывать парочку интерфейсов дизайнера...
Алексей1153
PAFOS, ну давай уже, жги )
PAFOS
Сорри за долгое молчание )

У дезигнера есть интерфейс QDesignerTaskMenuExtension, который позволяет добавлять свои пункты в это самое меню)
=> у комбо бокса этот интерфейс реализован.

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

Но это тока идеи) сам я этим не занимался :unsure:

Или же внутри своего плагина, создавать плагин комбо бокса и добавлять в своим actions, actions комбо бокса
Алексей1153
PAFOS, спасибо, гляну. Как раз сегодня надо этим всем уже вплотную занятся )) Хоть направление немного ясно стало
Алексей1153
детально ещё не разобрался, но вот мучает вопрос (и ответа я не встретил) - всё это позволяет менять свойства контрола на форме, но а как же заставить дизайнер создать тот код, который в ui при запуске программы вставит добавленные в редакторе элементы списка ?
PS Немного засыпаю от усталости, может поэтому тупняк нападает )))
PAFOS
Когда дизайнер вызывает QString QDesignerCustomWidgetInterface::domXml () const для твоего виджета, ты должен вернуть xml, описывающий виджет.
В этом методе ты как-то должен вызвать domXml для комбо бокса, он вернет свой xml описатель и ты вставишь его в свой.
Сделал на дизайнере форму и комбо бокс с тремя итемами.
Вот что выдал дизайнер:

Раскрывающийся текст
<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
<class>Form</class>
<widget class="QWidget" name="Form">
  <property name="geometry">
   <rect>
    <x>0</x>
    <y>0</y>
    <width>400</width>
    <height>300</height>
   </rect>
  </property>
  <property name="windowTitle">
   <string>Form</string>
  </property>
  <widget class="QComboBox" name="comboBox">
   <property name="geometry">
    <rect>
     <x>80</x>
     <y>90</y>
     <width>251</width>
     <height>22</height>
    </rect>
   </property>
   <item>
    <property name="text">
     <string>New Item</string>
    </property>
   </item>
   <item>
    <property name="text">
     <string>New Item</string>
    </property>
   </item>
   <item>
    <property name="text">
     <string>New Item</string>
    </property>
   </item>
   <item>
    <property name="text">
     <string>New Item</string>
    </property>
   </item>
  </widget>
</widget>
<resources/>
<connections/>
</ui>
Алексей1153
у меня метод domXml () сейчас пустой. Как его заполнять для своего контрорла - не ведаю. Или тупо вызвать оттуда комбовскую функцию domXml () ?

ааа, кажись потихоньку начинает доходить ))) Нужно как-то "перехватить" вызов domXml() у комбы и подставить нужные айтемы, так ?

так, снова гоню! Это же у самого контрола теперь такая виртуальная функция - от родителя QDesignerCustomWidgetInterface. Видимо, там и нужно нечто похожее собрать. Спасибо за пинки в нужную сторону )
Алексей1153
блин, какой-то замкнутый круг выходит

Я определил, что по умолчанию вертает domXml()

Сделал возвращение того же, но с двумя свойствами
<property name="text0"><string>111</string></property>
<property name="text1"><string>222</string></property>

эти свойства показались в дизе. И , я так понимаю, это выход - ведь как-то эти свойства в рантайме можно прочитать и заполнить ими комбу. Это ладно.

Далее, сделал так: в переопределённом domXml получаю дефолтную строку, вытаскиваю из неё имя переменной, составляю с участием этого имени нужный XML. И тут облом - при запуске диза он где-то неправильно инициализирует контрол, то ли имена пересекаются. После этого контрол не желает вообще перетаскиваться на форму

Куда дальше кидаться ?

в общем-то, по какому-то признаку нужно уметь определить, лежит ли контрол на форме или он лежит в списке контролов дизайнера. Во втором случае нужно вернуть дефолит - тогда было бы всё ок
PAFOS
Чета мало че понятно мне )

Код покажешь?
Алексей1153
дело застопорилось в связи с некоторыми событиями )) Я сейчас ещё поразбираюсь, потом с кодом приду, если никак совсем будет
Алексей1153
кое-как снова добрался до компа ))

в общем, проблема вот в чём

в классе, ответственном за появление контрола в ленте дизайнера, нужно неким образом
    class plugin_QMediaHiveControls_QLineEdit: public QObject, public QDesignerCustomWidgetInterface
    {
        Q_OBJECT
        Q_INTERFACES(QDesignerCustomWidgetInterface)

    protected:
        virtual QString domXml() const
        {
            return "";
        }

        ...
        ...

    };


по идее, нужно заставить вернуть нечто вроде
            return
            "    <widget class=\"QMediaHiveControls_QLineEdit\" name=\"m_name1\">"
            "     <property name=\"geometry\">"
            "      <rect>"
            "       <x>0</x>"
            "       <y>0</y>"
            "       <width>74</width>"
            "       <height>22</height>"
            "      </rect>"
            "     </property>"
            "     <item>"
            "      <property name=\"text\">"
            "       <string>111</string>"              //вот эти строки!
            "      </property>"
            "     </item>"
            "     <item>"
            "      <property name=\"text\">"
            "       <string>222</string>"              //вот эти строки!
            "      </property>"
            "     </item>"
            "     <item>"
            "      <property name=\"text\">"
            "       <string>333</string>"              //вот эти строки!
            "      </property>"
            "     </item>"
            "    </widget>"
    ;


но тут проблемы -
1) как узнать имя переменной (m_name1)
2) как связаться к экземпляром переменной, чтобы из неё данные достать и встроить в строку
PAFOS
посмотри пример QTDIR\examples\designer\containerextension.
очень много полезностей можно высмотреть.
Алексей1153
спасибо, щас гляну
Алексей1153
PAFOS, кстати, спасибо за помощь, я ведь тоггда победил эту фигню по твоим подсказкам ))

Если кому интересно, попозже накидаю описание, что было проделано
Алексей1153
интересный момент заметил. Поля Q_PROPERTY автоматом не сохраняются в XML, когда редактирование объекта происходит через интерфейс QDesignerTaskMenuExtension

В режиме редактирования все изменения показываются на виджете (оно и понятно, ведь меняли текущий созданный экземпляр), но если нажать ctrl+R , показывается превью, на котором изменений нет.

Возможно, по правильному лечится это как то особо (просьба подсказать) , но я нашёл только два способа
1) неприемлимый: нужно "дёрнуть" какую-нибудь из настроек виджета в разноцветной таблице редактирования свойств. Тогда XML заполняется нашими свойствами
2) относительно приемлимый: в domXML явно прописать с пустыми значениями все свойства в тегах
...
<property name = "свойство"><string></string></property>
...

Если "всё правильно", то наше свойство в цветной таблице дизайнера будет показано жирным шрифтом. И будет нормально сохраняться

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

Собственно, вопрос
Цитата
Возможно, по правильному лечится это как то особо (просьба подсказать)
Litkevich Yuriy
а версия Qt какя? И где работаешь в Дизайнере или Креаторе?
Алексей1153
Цитата
Qt Creator 2.0.1
Основан на Qt 4.7.0 (32-х битной)
Собран Aug 24 2010 в 11:00:55


работаю в креаторе, компилирую плагин там же. Затем в дизайнере использую плагин-контрол
Litkevich Yuriy
Я имел в виду "описаный баг проявляется в какой из программ?"
Алексей1153
в дизайнере и проявляется (в превью формы нет инициализированных значений свойств у контрола). Соответственно, если свойства не сохранены в XML, то контролы формы потом не инициализируются и в собранной программе. Так что, проявляется повсюду :(
PAFOS
Возможно в Q_PROPERTY() надо явно указывать атрибут STORED TRUE
Алексей1153
PAFOS, ок, при случае попробую ) Но я вроде пробовал этот атрибут - эффекта не было. Или я тогда что-то не так пробовал
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Форум IP.Board © 2001-2024 IPS, Inc.