Seite 1 von 1

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

Verfasst: 22. Juni 2008 22:40
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!

Verfasst: 23. Juni 2008 09:08
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.

Verfasst: 23. Juni 2008 11:50
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!

Verfasst: 23. Juni 2008 11:52
von PeterLustig
Das Central-Widget ist einfach deine zentrale Fläche, auf die alle anderen Widgets kommen.

Verfasst: 23. Juni 2008 12:25
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?

Verfasst: 23. Juni 2008 13:34
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.

Verfasst: 23. Juni 2008 20:29
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:

Verfasst: 23. Juni 2008 20:34
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...