Widget ausblenden
Widget ausblenden
Hi,
ich muss Euch leider noch einmal belästigen:
ich habe ein QMainWindow. Um nun die Inhalte zu wechseln, wenn ich auf verschiedene Menüpunkte klicke, habe ich verschiedene Konstruktoren, die mir die Inhalte erzeugen.
Den ersten Fensterinhalt erzeuge ich ganz einfach mit
(void)new Parameter( this );
Er wird auch richtig angezeigt, aber wie kann ich ihn aus dem MainWindow wieder unsichtbar machen, um einen neuen Inhalt anzuzeigen???
MfG, und vielen Dank im Voraus, Ozzy
ich muss Euch leider noch einmal belästigen:
ich habe ein QMainWindow. Um nun die Inhalte zu wechseln, wenn ich auf verschiedene Menüpunkte klicke, habe ich verschiedene Konstruktoren, die mir die Inhalte erzeugen.
Den ersten Fensterinhalt erzeuge ich ganz einfach mit
(void)new Parameter( this );
Er wird auch richtig angezeigt, aber wie kann ich ihn aus dem MainWindow wieder unsichtbar machen, um einen neuen Inhalt anzuzeigen???
MfG, und vielen Dank im Voraus, Ozzy
Re: Widget ausblenden
diese Zeile müsstest du mir mal genauer erklären? Wenn ich die jetzt, ohne es ausprobiert zu haben, richtig lese, castest du den Pointer, den dir new zurückliefert (auf eine Instanz der Klasse Paramter) in eine void Referenz und weist diese keiner Variablen zu? Ich bin verwirr (dass das überhaupt vom Compiler geschluckt wird)... deine Klasse heißt Parameter, oder? Hast du vorher schonmal C++ programmiert und jemals was mit Pointern, Variablendeklarationen & Co. zu tun gehabtOzzy hat geschrieben:Hi,
...
Den ersten Fensterinhalt erzeuge ich ganz einfach mit
(void)new Parameter( this );
...
Hi,
ja, C++ habe ich schon programmiert.
Diese Zeile wird übrigens auch bei Qt-Examples von Trolltech benutzt.
Wenn ich z.B.
Parameter *parameter = new Parameter( this );
schreibe, so wird nur das MainWindow angezeigt. Schreibe ich dahinter ein
parameter->show();
dann wird ein neues leeres Fenster angezeigt...
Wie würdest Du denn so etwas machen? Einfach in Elemente packen und ein- und ausblenden ist schwierig, da die Inhalte teilweise erneuert werden müssen...
MfG, Ozzy
ja, C++ habe ich schon programmiert.
Diese Zeile wird übrigens auch bei Qt-Examples von Trolltech benutzt.
Wenn ich z.B.
Parameter *parameter = new Parameter( this );
schreibe, so wird nur das MainWindow angezeigt. Schreibe ich dahinter ein
parameter->show();
dann wird ein neues leeres Fenster angezeigt...
Wie würdest Du denn so etwas machen? Einfach in Elemente packen und ein- und ausblenden ist schwierig, da die Inhalte teilweise erneuert werden müssen...
MfG, Ozzy
Hi,
danke für Eure Antworten, aber das ist irgendwie immer noch nicht so ganz das, was ich suche. Ich probiere es noch einmal zu erklären, denn vielleicht bin ich ja auch auf dem völlig falschen Weg:
Ich habe ein QMainWindow, welches eine Menüleiste besitzt.
Aus dieser heraus möchte ich nun die Fensterinhalte aufrufen.
Die Fensterinhalte sind selber wieder Klassen. Mein Grund dafür: einige Fensterinhalte können andere "manipulieren". Beispiel: in einem Fensterinhalt soll eine Anzahl für Elemente angeben werden. Klickt man nun im Menü auf "Zeige neues Fenster", dann sollen statt des alten Inhaltes ein neuer Fensterinhalt erscheinen, der so viele z.B. Textfelder hat, wie man vorher ausgewählt hat.
ist da setCentralWidget wirklich das richtige für???
MfG, und vielen Dank für Eure Hilfe,
Ozzy
danke für Eure Antworten, aber das ist irgendwie immer noch nicht so ganz das, was ich suche. Ich probiere es noch einmal zu erklären, denn vielleicht bin ich ja auch auf dem völlig falschen Weg:
Ich habe ein QMainWindow, welches eine Menüleiste besitzt.
Aus dieser heraus möchte ich nun die Fensterinhalte aufrufen.
Die Fensterinhalte sind selber wieder Klassen. Mein Grund dafür: einige Fensterinhalte können andere "manipulieren". Beispiel: in einem Fensterinhalt soll eine Anzahl für Elemente angeben werden. Klickt man nun im Menü auf "Zeige neues Fenster", dann sollen statt des alten Inhaltes ein neuer Fensterinhalt erscheinen, der so viele z.B. Textfelder hat, wie man vorher ausgewählt hat.
ist da setCentralWidget wirklich das richtige für???
MfG, und vielen Dank für Eure Hilfe,
Ozzy
Ok, ich glaub es mangelt an Grundkenntnissen, von daher lege ich dir nochmal das Tutorial ans Herz. Im Qt Assistant einfach auf Tutorial klicken oder hier:
http://doc.trolltech.com/4.3/tutorial.html
nichtsdestotrotz, kannst du dir hier Inspiration holen, ist allerdings sehr schlecht aufgebaut und soll nur die grundlegende Funktionsweise demonstrieren. Die Ui ist vom Typ QMainWindow:
wie gesagt sehr unschön gemacht, aber es funktioniert
ozzy.h
ozzy.cpp
http://doc.trolltech.com/4.3/tutorial.html
nichtsdestotrotz, kannst du dir hier Inspiration holen, ist allerdings sehr schlecht aufgebaut und soll nur die grundlegende Funktionsweise demonstrieren. Die Ui ist vom Typ QMainWindow:
wie gesagt sehr unschön gemacht, aber es funktioniert
ozzy.h
Code: Alles auswählen
#ifndef OZZY_H
#define OZZY_H
#include <QtGui/QMainWindow>
#include "ui_ozzy.h"
#include <QList>
#include <QLabel>
class QSpinBox;
class QVBoxLayout;
class Ozzy : public QMainWindow
{
Q_OBJECT
public:
Ozzy(QWidget *parent = 0);
~Ozzy();
protected slots:
void onTrigger();
private:
Ui::OzzyClass ui;
QWidget *m_pOne;
QWidget *m_pTwo;
QVBoxLayout *m_pLayoutForSecondWidget;
QSpinBox *m_pSpin;
QList<QLabel*> m_labelList;
};
#endif // OZZY_H
Code: Alles auswählen
#include <QSpinBox>
#include <QLabel>
#include <QVBoxLayout>
#include <QPushButton>
Ozzy::Ozzy(QWidget *parent)
: QMainWindow(parent)
{
ui.setupUi(this);
m_pOne = 0;
m_pTwo = 0;
m_pLayoutForSecondWidget = new QVBoxLayout(this);
m_pOne = new QWidget( this );
QVBoxLayout *pLayout = new QVBoxLayout();
m_pTwo = new QWidget ( this );
m_pTwo->setLayout( m_pLayoutForSecondWidget );
m_pSpin = new QSpinBox ( );
pLayout->addWidget(m_pSpin);
QPushButton *pButton = new QPushButton( "Push me",m_pOne );
pLayout->addWidget(pButton);
setCentralWidget( m_pOne );
m_pOne->setLayout(pLayout);
connect ( pButton, SIGNAL (clicked() ), this, SLOT (onTrigger() ) );
}
Ozzy::~Ozzy()
{
}
void Ozzy::onTrigger()
{
for ( int i = 0; i < m_pSpin->value(); i++ )
{
QLabel *pLabel = new QLabel( QString("Hallo ").append( QString::number(i)) );
m_labelList.append(pLabel);
pLabel->show();
m_pLayoutForSecondWidget->addWidget( pLabel );
}
setCentralWidget( m_pTwo );
}
Hi,
danke für Deine Antwort! Ich habe das jetzt mal bei mir eingebaut, nur dass es bei mir nicht funktioniert! Er zeigt zwar schön so häufig das Hallo an, wie er soll, aber er blendet das Feld mit dem Button nicht aus, legt die beiden Sachen also einfach übereinander.
Zusätzlich bekomme ich noch folgende Meldung:
Attempting to add QLayout "" to MainWindow "", which already has a layout.
Leider sagt er mir keine Zeilennummer an...
Hast Du dafür vielleicht eine Erklärung?
MfG, Ozzy
danke für Deine Antwort! Ich habe das jetzt mal bei mir eingebaut, nur dass es bei mir nicht funktioniert! Er zeigt zwar schön so häufig das Hallo an, wie er soll, aber er blendet das Feld mit dem Button nicht aus, legt die beiden Sachen also einfach übereinander.
Zusätzlich bekomme ich noch folgende Meldung:
Attempting to add QLayout "" to MainWindow "", which already has a layout.
Leider sagt er mir keine Zeilennummer an...
Hast Du dafür vielleicht eine Erklärung?
MfG, Ozzy
Hi,
also ich habe das noch mal etwas umgeschrieben:
MainWindow.h
MainWindow.ccp:
Das show() wird über das Menü aufgerufen.
Wenn ich das nun aber ausführe, so stürzt er mir immer mit der Meldung
*** Process aborted. Segmentation fault ***
ab.
Der Debugger sagt mir auch nur:
Program received signal SIGSEGV (Segmentation fault).
Könnt Ihr mir sagen, wo da mein Fehler ist???
MfG, Ozzy
also ich habe das noch mal etwas umgeschrieben:
MainWindow.h
Code: Alles auswählen
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
MainWindow( QWidget *parent=0 );
~MainWindow();
private:
void createActions();
void createMenus();
QWidget *p_FirstWidget;
QWidget *p_SecondWidget;
};Code: Alles auswählen
MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent) {
FirstWidget = new QWidget();
p_SecondWidget = new QWidget();
createActions();
createMenus();
QLabel *Label1 = new QLabel("Label 1");
QLabel *Label2 = new QLabel("Label 2");
QVBoxLayout *Layout1 = new QVBoxLayout(p_FirstWidget);
Layout1->addWidget(Label1);
QVBoxLayout *Layout2 = new QVBoxLayout( p_SecondWidget );
Layout2->addWidget(Label2);
setCentralWidget( p_FirstWidget );
}
void MainWindow::show() {
setCentralWidget(p_SecondWidget);
}
Wenn ich das nun aber ausführe, so stürzt er mir immer mit der Meldung
*** Process aborted. Segmentation fault ***
ab.
Der Debugger sagt mir auch nur:
Program received signal SIGSEGV (Segmentation fault).
Könnt Ihr mir sagen, wo da mein Fehler ist???
MfG, Ozzy