Seite 1 von 1

[gelöst] Dynamische Fenstergröße

Verfasst: 17. Juli 2007 13:12
von stonecold
Hallo,

ich habe folgendes Problem und auch die Suche im Forum konnte mir nicht so richtig helfen. Ich habe mit dem Designer ein MainWindow gebaut und zwar:

MainWindow mit CentralWidget (CW) , im CW ein QHBoxLayout (QL) und im QL eine QTreeView.

Nun möchte ich gerne, das wenn ich das MainWindow vergrößere auch die QTreeView mit vergrößert wird. Das Forum sagt: "Das macht das Layout automatisch" dem ist bei mir nicht so. Vielleicht habe ich ein bißchen zuviel rumprobiert.

Dem QL wird später dynamisch noch eine QGroupBox hinzugefügt. Die soll ihre Größe auch mit verändern (im übrigen beides nur in vertikaler Richtung). Mag sich vielleicht einer den Code aus dem ui_... .h_File anschauen und mir sagen was ich falsch mache?

Schon mal Danke und Gruß!

Code: Alles auswählen

#ifndef UI_XML_PARSER_H
#define UI_XML_PARSER_H

#include <QtCore/QVariant>
#include <QtGui/QAction>
#include <QtGui/QApplication>
#include <QtGui/QButtonGroup>
#include <QtGui/QHBoxLayout>
#include <QtGui/QMainWindow>
#include <QtGui/QMenu>
#include <QtGui/QMenuBar>
#include <QtGui/QStatusBar>
#include <QtGui/QTreeView>
#include <QtGui/QWidget>

class Ui_MainWindow
{
public:
    QAction *actionOpen;
    QAction *actionSave;
    QAction *actionExit;
    QWidget *centralwidget;
    QWidget *horizontalLayout;
    QHBoxLayout *hboxLayout;
    QTreeView *treeView;
    QMenuBar *menubar;
    QMenu *menuFile;
    QStatusBar *statusbar;

    void setupUi(QMainWindow *MainWindow)
    {
    MainWindow->setObjectName(QString::fromUtf8("MainWindow"));
    MainWindow->setMinimumSize(QSize(600, 600));
    MainWindow->setMaximumSize(QSize(600, 16777215));
    MainWindow->setDockNestingEnabled(true);
    actionOpen = new QAction(MainWindow);
    actionOpen->setObjectName(QString::fromUtf8("actionOpen"));
    actionSave = new QAction(MainWindow);
    actionSave->setObjectName(QString::fromUtf8("actionSave"));
    actionExit = new QAction(MainWindow);
    actionExit->setObjectName(QString::fromUtf8("actionExit"));
    centralwidget = new QWidget(MainWindow);
    centralwidget->setObjectName(QString::fromUtf8("centralwidget"));
    QSizePolicy sizePolicy(static_cast<QSizePolicy::Policy>(7), static_cast<QSizePolicy::Policy>(7));
    sizePolicy.setHorizontalStretch(0);
    sizePolicy.setVerticalStretch(0);
    sizePolicy.setHeightForWidth(centralwidget->sizePolicy().hasHeightForWidth());
    centralwidget->setSizePolicy(sizePolicy);
    horizontalLayout = new QWidget(centralwidget);
    horizontalLayout->setObjectName(QString::fromUtf8("horizontalLayout"));
    horizontalLayout->setGeometry(QRect(10, 20, 581, 541));
    hboxLayout = new QHBoxLayout(horizontalLayout);
    hboxLayout->setSpacing(6);
    hboxLayout->setMargin(0);
    hboxLayout->setObjectName(QString::fromUtf8("hboxLayout"));
    treeView = new QTreeView(horizontalLayout);
    treeView->setObjectName(QString::fromUtf8("treeView"));
    QSizePolicy sizePolicy1(static_cast<QSizePolicy::Policy>(0), static_cast<QSizePolicy::Policy>(7));
    sizePolicy1.setHorizontalStretch(220);
    sizePolicy1.setVerticalStretch(255);
    sizePolicy1.setHeightForWidth(treeView->sizePolicy().hasHeightForWidth());
    treeView->setSizePolicy(sizePolicy1);
    treeView->setMinimumSize(QSize(220, 520));
    treeView->setMaximumSize(QSize(220, 16777215));
    treeView->setHorizontalScrollBarPolicy(Qt::ScrollBarAsNeeded);
    treeView->setVerticalScrollMode(QAbstractItemView::ScrollPerItem);
    treeView->setHorizontalScrollMode(QAbstractItemView::ScrollPerItem);
    treeView->setIndentation(20);
    treeView->setRootIsDecorated(true);
    treeView->setUniformRowHeights(false);
    treeView->setItemsExpandable(false);
    treeView->setAllColumnsShowFocus(false);

    hboxLayout->addWidget(treeView);

    MainWindow->setCentralWidget(centralwidget);
    menubar = new QMenuBar(MainWindow);
    menubar->setObjectName(QString::fromUtf8("menubar"));
    menubar->setGeometry(QRect(0, 0, 600, 19));
    menuFile = new QMenu(menubar);
    menuFile->setObjectName(QString::fromUtf8("menuFile"));
    menuFile->setGeometry(QRect(222, 115, 112, 113));
    MainWindow->setMenuBar(menubar);
    statusbar = new QStatusBar(MainWindow);
    statusbar->setObjectName(QString::fromUtf8("statusbar"));
    MainWindow->setStatusBar(statusbar);

    menubar->addAction(menuFile->menuAction());
    menuFile->addAction(actionOpen);
    menuFile->addAction(actionSave);
    menuFile->addSeparator();
    menuFile->addAction(actionExit);

    retranslateUi(MainWindow);

    QSize size(600, 600);
    size = size.expandedTo(MainWindow->minimumSizeHint());
    MainWindow->resize(size);


    QMetaObject::connectSlotsByName(MainWindow);
    } // setupUi

    void retranslateUi(QMainWindow *MainWindow)
    {
    MainWindow->setWindowTitle(QApplication::translate("MainWindow", "SIM90 XML-Editor", 0, QApplication::UnicodeUTF8));
    actionOpen->setText(QApplication::translate("MainWindow", "&Open File", 0, QApplication::UnicodeUTF8));
    actionOpen->setShortcut(QApplication::translate("MainWindow", "Ctrl+O", 0, QApplication::UnicodeUTF8));
    actionSave->setText(QApplication::translate("MainWindow", "&Save File As...", 0, QApplication::UnicodeUTF8));
    actionSave->setIconText(QApplication::translate("MainWindow", "Save File", 0, QApplication::UnicodeUTF8));
    actionSave->setToolTip(QApplication::translate("MainWindow", "Save File", 0, QApplication::UnicodeUTF8));
    actionSave->setShortcut(QApplication::translate("MainWindow", "Ctrl+S", 0, QApplication::UnicodeUTF8));
    actionExit->setText(QApplication::translate("MainWindow", "E&xit", 0, QApplication::UnicodeUTF8));
    actionExit->setShortcut(QApplication::translate("MainWindow", "Ctrl+X", 0, QApplication::UnicodeUTF8));
    menuFile->setTitle(QApplication::translate("MainWindow", "&File", 0, QApplication::UnicodeUTF8));
    } // retranslateUi

};

namespace Ui {
    class MainWindow: public Ui_MainWindow {};
} // namespace Ui

#endif // UI_XML_PARSER_H


Verfasst: 17. Juli 2007 20:12
von upsala
Mag sich vielleicht einer den Code aus dem ui_... .h_File anschauen und mir sagen was ich falsch mache
Nein!

Zeig uns lieber das UI-File hierrein, denn der Code den du uns lieferst schaut sich keiner an!

Verfasst: 17. Juli 2007 20:31
von stonecold
Hier!

Verfasst: 17. Juli 2007 20:53
von upsala
Aha, gehts doch...
Das Forum sagt: "Das macht das Layout automatisch" dem ist bei mir nicht so.
Naja, du gibtst einigen Elementen die gleiche Minimale und Maximale Größe, was soll er dann noch automatisch machen? Üblich sind fürs minimum 0 und fürs maximum 16777215. Wenn du auf diese Werte zurückstellst, dann werden sich deine Widgets auch automatisch anpassen.

Verfasst: 17. Juli 2007 21:06
von stonecold
Naja, du gibtst einigen Elementen die gleiche Minimale und Maximale Größe
Das ist fast richtig.

Ich möchte eine Mindestgröße garantieren und auch nur ein automatisches Anpassen in vertikaler Richtung zulassen.

Lässt sich das nicht vereinbaren?

Die "height"-Werte sind nicht gleich groß.

Verfasst: 17. Juli 2007 22:12
von upsala
Setz mal in dein MainWindow noch ein Layout rein.

Verfasst: 17. Juli 2007 22:19
von stonecold
Habe das Problem jetzt gelöst, indem ich das resizeEvent() des MainWindow neu implementiert haben:

Code: Alles auswählen

void MainWindow::resizeEvent( QResizeEvent * event )
{
	int heightDiv = event->size().height() - event->oldSize().height();
	if(heightDiv < 500)
	{
		treeView->hide();
		scrollArea->hide();
		horizontalLayout->hide();
		centralwidget->hide();
		QRect rect = centralwidget->geometry();
		centralwidget->setGeometry( rect.x(), rect.y(), rect.width(), (rect.height() + heightDiv) );
		rect = horizontalLayout->geometry();
		horizontalLayout->setGeometry( rect.x(), rect.y(), rect.width(), (rect.height() + heightDiv) );	
		rect = treeView->geometry();
		treeView->setGeometry( rect.x(), rect.y(), rect.width(), (rect.height() + heightDiv) );
		rect = scrollArea->geometry();
		scrollArea->setGeometry( rect.x(), rect.y(), rect.width(), (rect.height() + heightDiv) );
		centralwidget->show();
		horizontalLayout->show();
		treeView->show();
		scrollArea->show();	
	}
}
Das

Code: Alles auswählen

if(heightDiv < 500)
habe ich gemacht, da beim Starten des Programms sofort ein resizeEvent ausgelöst wird und die Differenz "heightDiv" in dem Moment 0+Fenstergröße ist.
Folglich kommt bei

Code: Alles auswählen

(rect.height() + heightDiv)
dann mist raus. Lässt sich sicherlich eleganterlösen aber jetzt funktioniert es erstmal.

Verfasst: 17. Juli 2007 22:20
von stonecold
upsala hat geschrieben:Setz mal in dein MainWindow noch ein Layout rein.
Habe deinen Eintag jetzt erst gesehen. Probieres es aber trotzdem noch mal aus. Danke