Seite 1 von 1

[gelöst] QVBoxLayout soll ges. Breite des Fensters einnehmen

Verfasst: 10. Dezember 2009 11:27
von TheClerk
Guten Tag,

ich möchte eine relativ simple GUI schreiben, bei der es ein paar Felder gibt, um etwas einzutragen und ein paar Knöpfe, die man drücken kann. Theoretisch würde es so funktionieren, wie es jetzt ist, gefällt mir aber nicht. Mein Problem:

Ich mein MainWindow, in das ich mir eine QVBoxLayout gepackt habe. In dieses BoxLayout möchte ich nun weitere Layouts packen, z.B. ein GridLayout, darunter noch ein HBoxLayout, etc.

Ich habe schon ein GridLayout eingefügt und das Ganze sieht nun so aus:
Bild

Ich hätte es jetzt gerne so, dass die QLineEdit Objekte den gesamten Platz, der ihnen in der Breite zur Verfügung steht, nutzen. Wie mache ich das am besten?

Ich habe auch noch eine Frage zum Verständnis: Wird das Layout über die diversen Layoutklassen (GridLayout, BoxLayout, etc) geregelt oder über die Objekte, die sich darin befinden? Muss ich also dem LineEdit sagen, dass es sich soviel Platz krallen soll, wie möglich oder muss ich das dem Layout sagen? Oder vielleicht sogar beiden?

Mein Code sieht bisher so aus:

main.cpp

Code: Alles auswählen

#include <QtGui/QApplication>
#include "mainwindow.hpp"

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    MainWindow w;
    w.show();
    return a.exec();
}
mainwindow.hpp

Code: Alles auswählen

#ifndef MAINWINDOW_HPP
#define MAINWINDOW_HPP

#include <QtGui/QMainWindow>

#include <QVBoxLayout>

#include "filemenu.hpp"

class MainWindow : public QMainWindow{
    Q_OBJECT

public:
    MainWindow(QWidget *parent = 0);
    ~MainWindow();

private:
    // Methoden
    void initialise();

    // Attribute
    QVBoxLayout* vLayout;

    FileMenu* fileMenu;
};

#endif // MAINWINDOW_HPP
mainwindow.cpp

Code: Alles auswählen

#include "mainwindow.hpp"

// ---------- PUBLIC ----------

MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent){
    initialise();
}

MainWindow::~MainWindow(){

}

// ---------- PRIVATE ----------
void MainWindow::initialise(){
    this->resize(600, 400);
    vLayout = new QVBoxLayout();

    fileMenu = new FileMenu(this);
    fileMenu->adjustSize();
    vLayout->addWidget(fileMenu);
}
filemenu.hpp

Code: Alles auswählen

#ifndef FILEMENU_HPP
#define FILEMENU_HPP

#include <QGridLayout>
#include <QLabel>
#include <QLineEdit>
#include <QPushButton>
#include <QWidget>


class FileMenu : public QWidget{
public:
    FileMenu(QWidget* parent = 0);
private:
    // Methoden

    // Attribute in der Reihenfolge der Ansicht
    QLabel* sourceLabel;
    QLineEdit* sourceLine;
    QPushButton* sourceButton;
    QPushButton* readFileButton;
    QLabel* destLabel;
    QLineEdit* destLine;
    QPushButton* destButton;
};

#endif // FILEMENU_HPP
filemenu.cpp

Code: Alles auswählen

#include "filemenu.hpp"

FileMenu::FileMenu(QWidget* parent) : QWidget(parent){
    QGridLayout* layout = new QGridLayout();

    sourceLabel = new QLabel(this);
    sourceLabel->setText("Quelldatei:");
    layout->addWidget(sourceLabel, 0, 0);

    sourceLine = new QLineEdit(this);
    sourceLine->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);
    layout->addWidget(sourceLine, 0, 1);

    sourceButton = new QPushButton("Waehlen", this);
    layout->addWidget(sourceButton, 0, 2);

    readFileButton = new QPushButton("Datei lesen", this);
    layout->addWidget(readFileButton, 0, 3);

    destLabel = new QLabel(this);
    destLabel->setText("Zieldatei:");
    layout->addWidget(destLabel, 1, 0);

    destLine = new QLineEdit(this);
    layout->addWidget(destLine, 1, 1, 1, 2);

    destButton = new QPushButton("Waehlen", this);
    layout->addWidget(destButton, 1, 3);

    layout->setColumnStretch(1, 10);
    setLayout(layout);
}
Ich hoffe, ihr könnt mir weiterhelfen.

Schöne Grüße,
Simon

Verfasst: 10. Dezember 2009 11:34
von Mani99
Alles möglichkeiten findest du in der doku z.b. Stretch Factors oder addStretch(int) Am besten einfach mal durchschaun!

Verfasst: 10. Dezember 2009 11:38
von archer
In initialize Fehlt ein

Code: Alles auswählen

setLayout(...); 
In einem GridLayout würde ich dem Grid sagen vieviel Platz jede Spalte oder Zeile einnehmen soll.

Verfasst: 10. Dezember 2009 11:43
von franzf
Mani99 hat geschrieben:Alles möglichkeiten findest du in der doku z.b. Stretch Factors oder addStretch(int) Am besten einfach mal durchschaun!
In seinem Fall bringt das aber nichts.
Ein Layout ist dazu da, andere Widgets und Layouts auf einem bestimmten Widget anzuordnen. Das Layout dehnt sich dabei immer auf die volle Größe des Widgets aus.

Was du einfach nicht getan hast, ist dein Layout zuzuweisen!

Da du ein MainWindow hast, geht das aber nicht. Ein MainWindow verwendet ein eigenes Layout, setLayout gibt ne Warnung.
Du suchst "setCentralWidget"

Code: Alles auswählen

void MainWindow::initialise(){ 
    this->resize(600, 400); 

    fileMenu = new FileMenu(this);
    setCentralWidget(fileMenu); 
} 

Verfasst: 10. Dezember 2009 11:53
von TheClerk
Oha, das geht ja richtig fix hier im Forum :)

Danke für die Antworten. Es sollen ja noch mehr Einträge als das filemenu kommen, daher sollte ich das nicht als CentralWidget nehmen, denke ich. Ich habe jetzt aber sozusagen ein dummy-Widget erstellt, dass ich als CentralWidget nehme und dem dann das vBoxLayout zuweise. Das scheint zu funktionieren.

Verfasst: 10. Dezember 2009 12:44
von RHBaum
Eine der Grossen vorteile der Qt ist der Q(Dialog)Designer.

Alles was mit "layouts" zusammenhaengt, mach ich mit dem. Würd ich dir auch dringenst empfehlen.

Dadurch das man mit Platzhaltern arbeiten kann, (also quasi subclassen ) kann man auch teillayouts die man ned mit dem Designer bauen sollt (QSplitter etc) gut da reinhaengen.
Es gibt also kaum noch Gruende das ding ned zu verwenden !
(ich gebs zu am Anfang war ich auch QDesigner Skeptiker und hab lieber alles per hand selber gebaut, aber seit qt4 verwend ich den nur noch) .

Ciao ...