[so eine Art von geloest..., danke]cental Widget

Alles rund um die Programmierung mit Qt
Antworten
joebar
Beiträge: 177
Registriert: 3. Oktober 2006 02:04

[so eine Art von geloest..., danke]cental Widget

Beitrag von joebar »

Hallo,

ich weiss aus http://doc.trolltech.com/4.4/qmainwindow.html dass ein QMainWindow immer ein "central Widget" haben muss. Was mir aus der Doku nicht klar wird was genau dieses central Widget auszeichnet. ist es z.B. wie das Bild im obigen Link meinen koennte das Widget was mittig im QMainWindow dargestellt wird?

Ich habe ein Beispiel der Qt Doku (http://doc.trolltech.com/4.4/painting-basicdrawing.html) in meinen Code zum ausprobieren uebernehmen wollen, der Konstruktor des MainWindows sieht so aus

Code: Alles auswählen

MainWindow::MainWindow(){

QWidget *centralWidget = new QWidget;
renderArea = new RenderArea;

    shapeComboBox = new QComboBox;
    shapeComboBox->addItem(tr("Polygon"), RenderArea::Polygon);

    shapeLabel = new QLabel(tr("&Shape:"));
    shapeLabel->setBuddy(shapeComboBox);

    penWidthSpinBox = new QSpinBox;
    penWidthSpinBox->setRange(0, 20);
    penWidthSpinBox->setSpecialValueText(tr("0 (cosmetic pen)"));

    penWidthLabel = new QLabel(tr("Pen &Width:"));
    penWidthLabel->setBuddy(penWidthSpinBox);

    penStyleComboBox = new QComboBox;
    penStyleComboBox->addItem(tr("Solid"), Qt::SolidLine);


    penStyleLabel = new QLabel(tr("&Pen Style:"));
    penStyleLabel->setBuddy(penStyleComboBox);

    penCapComboBox = new QComboBox;
    penCapComboBox->addItem(tr("Flat"), Qt::FlatCap);

    penCapLabel = new QLabel(tr("Pen &Cap:"));
    penCapLabel->setBuddy(penCapComboBox);

    penJoinComboBox = new QComboBox;
    penJoinComboBox->addItem(tr("Miter"), Qt::MiterJoin);


    penJoinLabel = new QLabel(tr("Pen &Join:"));
    penJoinLabel->setBuddy(penJoinComboBox);

    brushStyleComboBox = new QComboBox;
    brushStyleComboBox->addItem(tr("Linear Gradient"),Qt::LinearGradientPattern);


    brushStyleLabel = new QLabel(tr("&Brush Style:"));
    brushStyleLabel->setBuddy(brushStyleComboBox);

    otherOptionsLabel = new QLabel(tr("Other Options:"));
    antialiasingCheckBox = new QCheckBox(tr("&Antialiasing"));
    transformationsCheckBox = new QCheckBox(tr("&Transformations"));

    QGridLayout *mainLayout = new QGridLayout;
    mainLayout->setColumnStretch(0, 1);
    mainLayout->setColumnStretch(3, 1);
    mainLayout->addWidget(renderArea, 0, 0, 1, 4);
    mainLayout->setRowMinimumHeight(1, 6);
    mainLayout->addWidget(shapeLabel, 2, 1, Qt::AlignRight);
    mainLayout->addWidget(shapeComboBox, 2, 2);
    mainLayout->addWidget(penWidthLabel, 3, 1, Qt::AlignRight);
    mainLayout->addWidget(penWidthSpinBox, 3, 2);
    mainLayout->addWidget(penStyleLabel, 4, 1, Qt::AlignRight);
    mainLayout->addWidget(penStyleComboBox, 4, 2);
    mainLayout->addWidget(penCapLabel, 5, 1, Qt::AlignRight);
    mainLayout->addWidget(penCapComboBox, 5, 2);
    mainLayout->addWidget(penJoinLabel, 6, 1, Qt::AlignRight);
    mainLayout->addWidget(penJoinComboBox, 6, 2);
    mainLayout->addWidget(brushStyleLabel, 7, 1, Qt::AlignRight);
    mainLayout->addWidget(brushStyleComboBox, 7, 2);
    mainLayout->setRowMinimumHeight(8, 6);
    mainLayout->addWidget(otherOptionsLabel, 9, 1, Qt::AlignRight);
    mainLayout->addWidget(antialiasingCheckBox, 9, 2);
    mainLayout->addWidget(transformationsCheckBox, 10, 2);


centralWidget -> setLayout(mainLayout);

setCentralWidget(centralWidget); // seg fault hier
}

Die letzte Zeile macht einen Segmentation Fault. Warum?

Danke!
Zuletzt geändert von joebar am 23. Juni 2008 13:34, insgesamt 1-mal geändert.
upsala
Beiträge: 3946
Registriert: 5. Februar 2006 20:52
Wohnort: Landshut
Kontaktdaten:

Beitrag von upsala »

Ich hatte bis jetzt noch keine Probleme, wenn das QMainWidget (zum testen) kein Central-Widget hatte...

Kannst du es mit dem Debugger genauer eingrenzen, warum das Programm abstürzt. So ist auf den ersten Blick nämlich kein Fehler zu erkennen.
joebar
Beiträge: 177
Registriert: 3. Oktober 2006 02:04

Beitrag von joebar »

Debugger.... zu advanced fuer mich... verstehe dass du mir evtl. ohne Debugger nicht helfen kannst.

Wie ist denn jetzt ein central Widget definiert, was zeichnet es aus?

Das Problem ist dass ich ohne central widget nicht das setLayout aufrufen kann. Ich kann/will ja nicht das Layout vom main window selber aendern.

Danke!
PeterLustig
Beiträge: 386
Registriert: 21. November 2007 20:07

Beitrag von PeterLustig »

Das Central-Widget ist einfach deine zentrale Fläche, auf die alle anderen Widgets kommen.
upsala
Beiträge: 3946
Registriert: 5. Februar 2006 20:52
Wohnort: Landshut
Kontaktdaten:

Beitrag von upsala »

Auch ein QWidget kann als 'Central-Widget' verwendet werden, es muß also gar nichts können.

Und wenn du keinen Debugger verwendest, woher willst du dann wissen, daß der Fehler bei setCentralWidget auftritt, und nicht woanders?
joebar
Beiträge: 177
Registriert: 3. Oktober 2006 02:04

Beitrag von joebar »

die zeile rausloeschen dann kommt kein seg fault mehr. Diese Zeile stand, wie ich jetzt durch weiteres "code loeschen" gefunden habe, irgendwie im Konflikt mit einem paint event, warum weiss ich nicht. Da muss ich nun erstmal selber suchen....

Danke.
shadowmasta
Beiträge: 8
Registriert: 2. April 2008 21:21
Wohnort: Rostock
Kontaktdaten:

Beitrag von shadowmasta »

Dazu hätte ich mal eine Frage wie kann ich denn meinen gdb nutzen mit Qt ?
Habe CodeBlocks und MinGW und auch gdb aber sobald ich ein eigenes Makefile(von Qt) benutze dann geht der gdb nicht mehr mit der codeblocks IDE. Oder macht ihr es immer manuell... per Konsole ?

Danke für Hinweise :wink:
Under construction
upsala
Beiträge: 3946
Registriert: 5. Februar 2006 20:52
Wohnort: Landshut
Kontaktdaten:

Beitrag von upsala »

die zeile rausloeschen dann kommt kein seg fault mehr.
Die Zeile bewirkt aber auch, daß sehr viel 'gerendert' wird, somit kannst du nicht darauf schließen, daß diese Zeile schuld daran ist...
Antworten