[gelöst] Dynamische Fenstergröße

Alles rund um die Programmierung mit Qt
Antworten
stonecold
Beiträge: 147
Registriert: 19. Oktober 2005 10:48

[gelöst] Dynamische Fenstergröße

Beitrag 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

Zuletzt geändert von stonecold am 17. Juli 2007 22:12, insgesamt 1-mal geändert.
upsala
Beiträge: 3946
Registriert: 5. Februar 2006 20:52
Wohnort: Landshut
Kontaktdaten:

Beitrag 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!
stonecold
Beiträge: 147
Registriert: 19. Oktober 2005 10:48

Beitrag von stonecold »

Hier!
Dateianhänge
xml_parser.ui
Hier das UI-File
(4.58 KiB) 110-mal heruntergeladen
upsala
Beiträge: 3946
Registriert: 5. Februar 2006 20:52
Wohnort: Landshut
Kontaktdaten:

Beitrag 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.
stonecold
Beiträge: 147
Registriert: 19. Oktober 2005 10:48

Beitrag 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ß.
upsala
Beiträge: 3946
Registriert: 5. Februar 2006 20:52
Wohnort: Landshut
Kontaktdaten:

Beitrag von upsala »

Setz mal in dein MainWindow noch ein Layout rein.
stonecold
Beiträge: 147
Registriert: 19. Oktober 2005 10:48

Beitrag 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.
stonecold
Beiträge: 147
Registriert: 19. Oktober 2005 10:48

Beitrag 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
Antworten