qt4: layouts
-
moin zusammen,
vorab, ich bin noch nicht so bewandert in qt
darum vielleicht meine triviales problem.
ich habe eine eigene widget klasse geschrieben die lineedit und den slider kombiniert. innerhalb des ctors der klasse lege ich mittels qvboxlayout das layout fest (slider oben, editbox unterhalb).
jetzt benötige ich eine zweite klasse die von der ersten erbt. diese erweitert das ganze um ne checkbox mit der der slider und die editbox aktiviert werden.
jetzt möchte ich zb: das sich die checkbox links vom slider befindet.
wie stelle ich das an? muss ich das layout mitführen?beispiel code
EditableSlider::EditableSlider(QWidget *parent) : QWidget(parent), // ... { // .. QVBoxLayout *layout = new QVBoxLayout; layout->addWidget(m_pEdit); layout->addWidget(m_pSlider); setLayout(layout); } // erbt von EditableSlider ClickableEditSlider::ClickableEditSlider(const QString& label, QWidget *parent) : EditableSlider(parent) { QHBoxLayout *layout = new QHBoxLayout; layout->addWidget(m_pCheck); // so, und nu? setLayout(layout); }
-
Ist es denn zu viel Aufwand, das andere Layout neu zu schreiben?
Ansonsten hat jedes QLayout eine Methode "itemAt(index);
Übergib als index "0" und hol dir dein QWidget* QLayoutItem::widget(); SOllte dein Slider sein. Die Widgets sind aber sicherlich Member deiner Klasse, oder? Dann kannst du dir das schenken.Der Rest könnte so ausschauen:
ClickableEditSlider::ClickableEditSlider(const QString& label, QWidget *parent) : EditableSlider(parent) { QHBoxLayout *l; if( !layout() ) { // Sollte eigentlich nicht passieren, da Basis bereits initialisiert (k.A. ob man das so sagt :D) // muss hier halt dann dein ganzes Layout neu aufsetzen... initLayout(); } else { l = qobject_cast<QVBoxLayout*>(layout()) if( !l ) { initLayout(); } else { layout->removeWidget(m_pSlider); QHBoxLayout* hBox = new QHBoxLayout(this); hBox->addWidget(m_pCheck); hBox->addWidget(m_pSlider); layout->insertLayout(0, hBox); } } }
Habs jetzt nicht kompiliert, kann also sein, dass irgendwo ein Schreibfehler ist.
Aber der Ansatz wird wohl das sein, was du benötigst.Grüße
Franz
-
franz schrieb:
Ist es denn zu viel Aufwand, das andere Layout neu zu schreiben?
wenn man wüsste wie, sicherlich nicht
franz schrieb:
Ansonsten hat jedes QLayout eine Methode "itemAt(index);
Übergib als index "0" und hol dir dein QWidget* QLayoutItem::widget(); SOllte dein Slider sein. Die Widgets sind aber sicherlich Member deiner Klasse, oder? Dann kannst du dir das schenken.ne, is nen member. d.h. du würdest ein die member der "basisklasse" in das neue layout packen? aber das layout besteht ja schon in der basisklasse und es anzugeben wir im unten genannten code geht leider nicht und was würde mit dem bestehenden layout passieren? verwaist? ist deine lösung gängig? oder würdest du es ganz anders machen?
QHBoxLayout *layout = new QHBoxLayout; layout->addWidget(m_pCheck); layout->addLayout(EditableSlider::layout()); setLayout(layout);
-
miller_m schrieb:
franz schrieb:
Ist es denn zu viel Aufwand, das andere Layout neu zu schreiben?
wenn man wüsste wie, sicherlich nicht
Naja, einfach die Widgets in ein Layout einfügen das deine Anforderungen entspricht, und das dann zuweisen.
QVBoxLayout* mainLayout = new QVBoxLayout(this); QHBoxLayout* topLayout = new QHBoxLayout(this); topLayout->addWidget(m_pCheck); topLayout->addWidget(m_pSlider); mainLayout->addLayout(topLayout); mainLayout->addWidget(m_plineEdit); setLayout(mainLayout);
Also einfach das Layout komplett neu machen...
ne, is nen member. d.h. du würdest ein die member der "basisklasse" in das neue layout packen? aber das layout besteht ja schon in der basisklasse und es anzugeben wir im unten genannten code geht leider nicht und was würde mit dem bestehenden layout passieren? verwaist?
Der Code den ich gepostet habe, nimmt dein bereits bestehendes Layout aus der Basisklasse, entfernt den Slider, fügt diesen nach der CheckBox in ein HBoxLayout, welches wieder an index "0" in das bereits bestehende Layout eingefügt wird.
ist deine lösung gängig? oder würdest du es ganz anders machen?
Ich würde es nicht mit Vererbung machen. Es kommt ja eigentlich nur eine neue Eigenschaft dazu, nämlich die CheckBox.
Ich würde einfach das Layout gleich so einrichten wie in ClickableEditSlider (also mit CheckBox) und der Klasse einen Slot geben:EditSlider::setCheckable( bool on ) { m_pCheck->setVisible( on ); }
-
mmmhhh... ich glaub ich habe es jetzt verstanden. d.h. ich komme einfach nicht drum rum ein "neues" layout zu basteln und kann nicht so einfach auf das bestehende layout zurückgreifen, ausser ich würde es als member machen....
werde es heute abend mal testen, dank dir.franz schrieb:
Ich würde es nicht mit Vererbung machen. Es kommt ja eigentlich nur eine neue Eigenschaft dazu, nämlich die CheckBox.
genau das spricht doch für eine vererbung
-
miller_m schrieb:
franz schrieb:
Ich würde es nicht mit Vererbung machen. Es kommt ja eigentlich nur eine neue Eigenschaft dazu, nämlich die CheckBox.
genau das spricht doch für eine vererbung
Du kannst dich ja mal fragen, ob du auch die abgeleitete Klasse mit nem Basisklassenzeiger ansprechen willst.
Wie viel Code würdest du dir (mit 2 Klassen) sparen, wenn du sie ableitetest?Ich wollt dich auch noch auf die QGroupBox aufmerksam machen. Die gibt es auch mit und ohne CheckBox. Sind keine 2 Klassen, die GroupBox hat einfach nur Methoden
* void setCheckable(bool)
* bool isCheckable()
* bool isChecked()
Und das wars. Kannst dich ja mal vom GroupBox-Code inspirieren lassenGrüße
Franz
-
danke für deine hilfe. ich habe es jetzt ganz anders gelösst
grüsse