crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )

 
Ответить в данную темуНачать новую тему
> Как правильно загрузить .ui форму с собственными виджетами?
mva
  опции профиля:
сообщение 6.4.2011, 23:16
Сообщение #1


Участник
**

Группа: Участник
Сообщений: 104
Регистрация: 15.3.2009
Из: Киров
Пользователь №: 615

Спасибо сказали: 3 раз(а)




Репутация:   0  


Добрый день всем!

У меня есть форма в виде отдельного файла .ui, которая загружается в программу по ходу работы. На этой форме имеются созданные мной виджеты. Форма была сгенерирована самой программой, при этом загружается в QtDesigner нормально и нормально в нем отображается. Проблема в том, что форма работает не стабильно, через раз выпадая по ошибке сегментирования.

Вот так я загружаю форму:
QDialog* formWidget;

...

QFile file(fileName + ".ui");
if (file.open(QIODevice::ReadOnly)) {
        QUiLoader loader;
        loader.addPluginPath("./plugins/");
        QWidget* widget = loader.load(&file);
        if (QString(widget->metaObject()->className()).compare("QDialog") == 0) {
            formWidget = (QDialog*)widget;
           ...
        }
        ...
}


Сбой обычно происходит во время поиска потомков на форме:
QList<QPushButton*> widgets = formWidget->findChildren<QPushButton*>();


Я покопался отладчиком. Похоже, что у "самодельных" виджетов не хватает какой-то мета-информации. Как это победить?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
PAFOS
  опции профиля:
сообщение 7.4.2011, 8:03
Сообщение #2


Активный участник
***

Группа: Участник
Сообщений: 258
Регистрация: 27.12.2010
Из: Дмитров
Пользователь №: 2309

Спасибо сказали: 29 раз(а)




Репутация:   8  


Давай код ui. Там будем разбираться )
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
mva
  опции профиля:
сообщение 9.4.2011, 12:15
Сообщение #3


Участник
**

Группа: Участник
Сообщений: 104
Регистрация: 15.3.2009
Из: Киров
Пользователь №: 615

Спасибо сказали: 3 раз(а)




Репутация:   0  


Содержимое ui файла такое:
<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
<class>dialog</class>
<widget class="QDialog" name="dialog">
  <property name="geometry">
   <rect>
    <x>0</x>
    <y>0</y>
    <width>400</width>
    <height>593</height>
   </rect>
  </property>
  <property name="name" stdset="0">
   <string>Справочник.vw_список_топер</string>
  </property>
  <property name="caption" stdset="0">
   <string>Справочник. Типовые операции</string>
  </property>
  <layout class="QVBoxLayout" name="vbxLayout">
   <item>
    <layout class="QHBoxLayout">
     <item>
      <widget class="QLabel" name="label">
       <property name="sizePolicy">
        <sizepolicy hsizetype="Fixed" vsizetype="Fixed">
         <horstretch>0</horstretch>
         <verstretch>0</verstretch>
        </sizepolicy>
       </property>
       <property name="text">
        <string>Параметры для поиска:</string>
       </property>
      </widget>
     </item>
     <item>
      <widget class="SearchParameters" name="searchParameters"/>
     </item>
    </layout>
   </item>
   <item>
    <layout class="QHBoxLayout" name="hbxLayout">
     <item>
      <widget class="TableView" name="tableView"/>
     </item>
    </layout>
   </item>
   <item>
    <layout class="QHBoxLayout" name="cmdButtonLayout">
     <item>
      <widget class="QPushButton" name="buttonAdd">
       <property name="text">
        <string>Вставить</string>
       </property>
       <property name="icon">
        <iconset resource="../../src/resources.qrc">
         <normaloff>:/buttonAdd</normaloff>:/buttonAdd</iconset>
       </property>
      </widget>
     </item>
     <item>
      <widget class="QPushButton" name="buttonRequery">
       <property name="text">
        <string>&amp;Обновить</string>
       </property>
       <property name="icon">
        <iconset>
         <normaloff>:buttonRequery</normaloff>
         <normalon>:buttonRequery</normalon>
         <activeoff>:buttonRequery</activeoff>
         <activeon>:buttonRequery</activeon>
         <selectedoff>:buttonRequery</selectedoff>
         <selectedon>:buttonRequery</selectedon>:buttonRequery</iconset>
       </property>
      </widget>
     </item>
     <item>
      <spacer name="horizontalSpacer">
       <property name="orientation">
        <enum>Qt::Horizontal</enum>
       </property>
       <property name="sizeHint" stdset="0">
        <size>
         <width>40</width>
         <height>20</height>
        </size>
       </property>
      </spacer>
     </item>
     <item>
      <widget class="QPushButton" name="buttonOk">
       <property name="text">
        <string>&amp;Принять</string>
       </property>
       <property name="icon">
        <iconset>
         <normaloff>:buttonOk</normaloff>
         <normalon>:buttonOk</normalon>
         <activeoff>:buttonOk</activeoff>
         <activeon>:buttonOk</activeon>
         <selectedoff>:buttonOk</selectedoff>
         <selectedon>:buttonOk</selectedon>:buttonOk</iconset>
       </property>
      </widget>
     </item>
     <item>
      <widget class="QPushButton" name="buttonCancel">
       <property name="text">
        <string>&amp;Отменить</string>
       </property>
       <property name="icon">
        <iconset>
         <normaloff>:buttonCancel</normaloff>
         <normalon>:buttonCancel</normalon>
         <activeoff>:buttonCancel</activeoff>
         <activeon>:buttonCancel</activeon>
         <selectedoff>:buttonCancel</selectedoff>
         <selectedon>:buttonCancel</selectedon>:buttonCancel</iconset>
       </property>
      </widget>
     </item>
    </layout>
   </item>
  </layout>
</widget>
<customwidgets>
  <customwidget>
   <class>TableView</class>
   <extends>QTableView</extends>
   <header>tableview.h</header>
  </customwidget>
  <customwidget>
   <class>SearchParameters</class>
   <extends>QFrame</extends>
   <header>searchparameters.h</header>
  </customwidget>
</customwidgets>
<resources>
  <include location="../../src/resources.qrc"/>
</resources>
<connections/>
</ui>


Сбой происходит на стандартных объектах QPushButton.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
mva
  опции профиля:
сообщение 9.4.2011, 19:52
Сообщение #4


Участник
**

Группа: Участник
Сообщений: 104
Регистрация: 15.3.2009
Из: Киров
Пользователь №: 615

Спасибо сказали: 3 раз(а)




Репутация:   0  


Кажется решил проблему. Заменил

QList<QPushButton*> widgets = formWidget->findChildren<QPushButton*>();

на

QList<QPushButton*> widgets = qFindChildren<QPushButton*>(formWidget);

Вроде бы глючить случайным образом перестало. Но корень проблемы по-прежнему не ясен.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0




RSS Текстовая версия Сейчас: 27.2.2021, 1:04