Seite 1 von 2
Widget ausblenden
Verfasst: 1. November 2007 11:27
von Ozzy
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
Re: Widget ausblenden
Verfasst: 1. November 2007 14:52
von Korgen
Ozzy hat geschrieben:Hi,
...
Den ersten Fensterinhalt erzeuge ich ganz einfach mit
(void)new Parameter( this );
...
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 gehabt

Verfasst: 1. November 2007 15:58
von Ozzy
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
Verfasst: 1. November 2007 17:37
von dhcase
Verfasst: 1. November 2007 18:16
von Korgen
Verfasst: 2. November 2007 14:39
von 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
Verfasst: 2. November 2007 16:15
von Korgen
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
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
ozzy.cpp
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 );
}
Verfasst: 5. November 2007 08:45
von Ozzy
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
Verfasst: 5. November 2007 10:39
von Ozzy
Hi,
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;
};
MainWindow.ccp:
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);
}
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
Verfasst: 6. November 2007 08:02
von Korgen
wann stürzt er ab? Sobald du das Programm startest? Mach mal 'nen Breakpoint in die show Method und checke ob dein Widgetpointer evtl. nicht initialisiert ist
Grüße
Verfasst: 6. November 2007 08:08
von Ozzy
Hi,
ne er stürzt ab, sobal ich probiere, ich die Show-Methode aufrufe. Er mag wohld das
setCentralWidget(p_SecondWidget);
nicht...
MfG, Ozzy
Verfasst: 6. November 2007 08:15
von Ozzy
Aber um noch eine Frage dazuzustellen:
Kann man auch bei Tabs die Inhalte noch verändern? Also wenn man auf einen Reiter klickt, so soll er die Werte des vorherigen Reisters anzeigen. Geht so etwas auch???
MfG, Ozzy
Verfasst: 6. November 2007 08:25
von Korgen
also das hört sich für mich danach an, als ob dein Widget Pointer einfach auf ein nicht gültiges Widget zeigen würde.
Mit 'nem Tabwidget kenn ich mich nicht so aus, aber geht sicherlich. AddTab und removeTab gibt es ja schließlich...
Verfasst: 6. November 2007 08:29
von Ozzy
Hm, aber der der Quelltext steht ja oben, und ich sehe da irgendwie keinen Fehler... Vielleicht habe ich auch einfach schon zu lange draufgeschaut...
MfG, Ozzy
Verfasst: 6. November 2007 08:56
von Korgen
setz doch einfach einen Breakpoint und schau ob der Pointer auf ein gültiges QWidget zeigt... versteh nicht, woran da das Problem sein soll?!
