Вызов пользовательского класса в файле .ui не удался

Я получаю эту ошибку, когда пытаюсь сослаться на свой пользовательский класс из.ui файл. Что не так с тем, что я делаю?

"QFormBuilder was unable to create a custom widget of the class 'TimelinePane'; defaulting to base class 'QWidget'." 

QWidget всплывает с макетом, который я указываю в.ui файл. Проблема только в пользовательском классе.

Чтобы добавить описание пользовательского класса, я изменил.ui файл вручную (добавлен весь<customwidgets> раздел), поэтому я должен открыть новый вопрос, так как я еще не нашел тот же вопрос. Я подозреваю, что путь класса в.ui файл, но ни один из вариантов, которые я пробовал (см. часть, которую я закомментировал), не работал. Я также думаю, что с помощьюpython не должно быть дело здесь, но я не совсем уверен. Не пробовалC++ все же.

from PySide import QtGui  
from PySide import QtCore
from PySide import QtUiTools

class MyWidget(QtGui.QMainWindow):
    def __init__(self, *args):  
       apply(QtGui.QMainWindow.__init__, (self,) + args)

       loader = QtUiTools.QUiLoader()
       file = QtCore.QFile('./src/prove_qt_ui_file/prove_main_widget.ui') 
       file.open(QtCore.QFile.ReadOnly)
       self.myWidget = loader.load(file, self)
       file.close()
       self.setCentralWidget(self.myWidget)

if __name__ == '__main__':  
   import sys  
   import os
   print("Running in " + os.getcwd() + " .\n")
   app = QtGui.QApplication(sys.argv)  
   win  = MyWidget()  
   win.show()
   app.exec_()

prove_main_widget.ui

<?xml version="1.0" encoding="UTF-8" ?>
<ui version="4.0">
 <class>MyWidget</class>
 <widget class="QWidget" name="MyWidget">
  <property name="geometry">
   <rect>
    <x>0</x>
    <y>0</y>
    <width>687</width>
    <height>698</height>
   </rect>
  </property>
  <property name="windowTitle">
   <string>Runtime Monitor</string>
  </property>
  <layout class="QVBoxLayout">
   <property name="spacing">
    <number>0</number>
   </property>
   <property name="margin">
    <number>0</number>
   </property>
   <item>
    <widget class="QSplitter" name="splitter">
     <property name="orientation">
      <enum>Qt::Vertical</enum>
     </property>
     <property name="handleWidth">
      <number>9</number>
     </property>
     <widget class="QTreeWidget" name="warn_tree">
      <attribute name="headerVisible">
       <bool>false</bool>
      </attribute>
      <column>
       <property name="text">
        <string notr="true">1</string>
       </property>
      </column>
     </widget>
     <widget class="QTreeWidget" name="tree_all_devices">
      <attribute name="headerVisible">
       <bool>false</bool>
      </attribute>
      <column>
       <property name="text">
        <string notr="true">1</string>
       </property>
      </column>
     </widget>
     <widget class="TimelinePane" name="timeline_pane" native="true">
      <property name="minimumSize">
       <size>
        <width>0</width>
        <height>80</height>
       </size>
      </property>
      <property name="whatsThis">
       <string extracomment="Timeline"/>
      </property>
     </widget>
    </widget>
   </item>
  </layout>
 </widget>
 <customwidgets>
  <customwidget>
   <class>TimelinePane</class>
   <extends>QWidget</extends>
<!--   <header>timeline_pane</header> --> <!-- NG -->
<!--   <header>prove_qt_ui_file.timeline_pane</header> --> <!-- NG -->
   <header>src.prove_qt_ui_file.timeline_pane</header>  <!-- NG -->
  </customwidget>
 </customwidgets>
 <resources/>
 <connections/>
</ui>

timeline_pane.py

from PySide.QtGui import QWidget, QGraphicsScene, QGraphicsView, QColor, QHBoxLayout, QPushButton
class TimelinePane(QWidget):
    def __init__(self, parent):
        super(TimelinePane, self).__init__()
        print '\tTimelinePane init 1' # This doesn't print.

(Окружающая среда) Ubuntu 12.04, python 2.7.3

 Kamil Klimek31 окт. 2012 г., 12:15
Вы должны создать дизайнерский плагин для своего пользовательского виджета, чтобы он работал с QUiBuilder

Ответы на вопрос(1)

чтобы ваш собственный виджет работал, вам нужно всего лишь позвонить:

loader.registerCustomWidget(TimelinePane)

перед вызовом loader.load (). Вам необходимо добавить соответствующие операторы импорта, в вашем случае:

from timeline_pane import TimelinePane

Тем не менее, я только что протестировал это с PySide 1.1.2 на Ubuntu 12.04 x86_64, и это вызвало segfault. YMMV, поэтому, пожалуйста, проверьте.

В итоге я реализовал этот обходной путь:http://www.mail-archive.com/[email protected]/msg00306.html

Короче говоря, переопределите метод creteWidget () в QUiLoader, и если имя_класса виджета отсутствует в self.availableWidgets (), создайте его экземпляр самостоятельно в соответствии с добавленной переменной экземпляра customWidgets.

Кстати, вы также можете использовать правую кнопку мыши на функциональности «Повышение в» в Qt Designer вместо непосредственного редактирования файла пользовательского интерфейса.

 cfi30 июн. 2013 г., 11:40
Та же / аналогичная проблема здесь: Хотя ваш обходной путь может вызвать графический интерфейс, он все еще не может создать customWidget:AttributeError: type object 'PySide.QtGui.QWidget' has no attribute 'customWidgets', Может я использую не тот базовый класс?
 Charl Botha30 июн. 2013 г., 15:53
Подразумевается, что вы делаете дочерний классQUiLoader, В своем__init__ Вы вызываете родительский init, но также устанавливаетеcustomWidgets словарь на себя (переданный вызывающим абонентом).

Ваш ответ на вопрос