Seite 1 von 1

[gelöst] Custom widget - Problem mit der Einbettung

Verfasst: 7. Dezember 2006 23:20
von robes
Hallo,

Ich portiere grade ein Programm ins Qt4 und hab ein Problem mit einem custom widget (ein Q3ComboBox-derivat). Beim start des Programms wird meine ComboBox als ein zweites Fenster gestartet. Alle Signals funktionieren aber wunderbar - sie ist nur halt nicht eingebettet.

Die Deklaration im .ui File

Code: Alles auswählen

  <customwidget>
   <class>PercentageComboBox</class>
   <extends>QComboBox</extends>
   <header>percentagecombobox.h</header>
  </customwidget>
Die Einbettung in ein toolbar:

Code: Alles auswählen

  <widget class="Q3ToolBar" name="editToolbar" >
   <property name="geometry" >
    <rect>
     <x>216</x>
     <y>0</y>
     <width>173</width>
     <height>30</height>
    </rect>
   </property>
   <property name="opaqueMoving" >
    <bool>true</bool>
   </property>
   <property name="label" >
    <string>Toolbar</string>
   </property>
   </property>
   <widget class="PercentageComboBox" native="1" name="viewZoomComboBox" >
    <property name="enabled" >
     <bool>false</bool>
    </property>

Andere widgets aus dem toolbar werden normal angezeigt

Der header von percentagecombobox:

Code: Alles auswählen

class PercentageComboBox : public Q3ComboBox
{
    Q_OBJECT
            
    public:
        PercentageComboBox(QWidget* parent, const char *name);
	PercentageComboBox();

(...)
wobei immer der untere Konstruktor aufgeruffen wird, dh. es wird kein parent übergeben. Darauf hab ich aber keinen Einfluss, weil es in der aus .ui generierten Datei aufgeruffen wird.

Code: Alles auswählen

Der Konstruktor in der cpp:
PercentageComboBox::PercentageComboBox()  :Q3ComboBox()
{ (...)
Im Designer sieht man das widget garnicht - ist nur eine kleine graue Fläche.

Verfasst: 8. Dezember 2006 10:04
von upsala
Entweder du erstellt einen Konstruktor der nur ein QWidget *parent enthält oder du sorgst dafür, daß die restlichen Parameter als optional angesehen werden.

Code: Alles auswählen

PercentageComboBox(QWidget* parent, const char *name=0); 
PercentageComboBox(QWidget* parent); 
PercentageComboBox(QWidget* parent=0, const char *name=0); 
PercentageComboBox(QWidget* parent=0); 
Sollte meiner Meinung nach alles funktionieren...

Verfasst: 8. Dezember 2006 15:10
von robes
upsala hat geschrieben:Entweder du erstellt einen Konstruktor der nur ein QWidget *parent enthält oder du sorgst dafür, daß die restlichen Parameter als optional angesehen werden.

Code: Alles auswählen

PercentageComboBox(QWidget* parent, const char *name=0); 
PercentageComboBox(QWidget* parent); 
PercentageComboBox(QWidget* parent=0, const char *name=0); 
PercentageComboBox(QWidget* parent=0); 
Sollte meiner Meinung nach alles funktionieren...

In der - aus dem ui ertsellten - .h Datei wird schon

Code: Alles auswählen

new PercentageComboBox() 
aufgeruffen. Es wird also nichts übergeben.

Aber ich hab das Problem gefunden - die Qt3Toolbar akzeptiert nur Objekte die Q3Actions sind - dh. keine Q3ComboBox'en derivate. Daher wird der PercentageComboBox kein Elter mitgeteilt, weil es eben keinen gibt. Wenn ich die ComboBox in ein Layout reinstecke, wird in der erstellten .h Datei schon

Code: Alles auswählen

new PercentageComboBox(widget) 
aufgeruffen, wobei widget ein QWidget ist:

Code: Alles auswählen

widget = new QWidget(MainWindowBase); 
sollte also passen - würde man meinen, aber nix da:

Code: Alles auswählen

e:\MediProjekt\.ui\form.h(830) : error C2664: 'PercentageComboBox::PercentageComboBox(const PercentageComboBox &)': Konvertierung des Parameters 1 von 'QWidget *' in 'const PercentageComboBox &' nicht möglich
Was ist da los?? Ich hab doch nirgends einen Konstruktor der ne PercentageComboBox als Parameter nimmt! Hab die Projektmappe dursucht, ob vielleicht mein Vorgänger irgendwo was versteckt hat - aber so'n Konstruktor existiert nicht!

Verfasst: 8. Dezember 2006 17:46
von upsala
Die letzte Fehlermeldung besagt, daß du einen Pointer nicht an eine Referenz übergeben kannst...

Verfasst: 8. Dezember 2006 21:18
von robes
Hab das Problem auch schon behoben - es lag daran, dass der zweite Parameter (name) nicht als Optional deklariert war und der Kompiler eben versucht hat das widget and den einzigen Konstruktor mit nur einem Parameter (copy-Konstruktor) zu übergeben, was natürlich zu inkompatibilitäten in den Parametern führte.