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

Alles rund um die Programmierung mit Qt
Antworten
robes
Beiträge: 11
Registriert: 1. Dezember 2006 14:14
Wohnort: DO

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

Beitrag 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.
Zuletzt geändert von robes am 8. Dezember 2006 21:26, insgesamt 1-mal geändert.
upsala
Beiträge: 3946
Registriert: 5. Februar 2006 20:52
Wohnort: Landshut
Kontaktdaten:

Beitrag 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...
robes
Beiträge: 11
Registriert: 1. Dezember 2006 14:14
Wohnort: DO

Beitrag 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!
upsala
Beiträge: 3946
Registriert: 5. Februar 2006 20:52
Wohnort: Landshut
Kontaktdaten:

Beitrag von upsala »

Die letzte Fehlermeldung besagt, daß du einen Pointer nicht an eine Referenz übergeben kannst...
robes
Beiträge: 11
Registriert: 1. Dezember 2006 14:14
Wohnort: DO

Beitrag 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.
Antworten