Layout über Code erzeugen
-
Hi,
ich versuche gerade ein Layout über den Code zu erzeugen.
Natürlich geht das auch viel einfacher über den Designer wenn man eine .ui Datei hat.Bei folgendem Programm funktioniert das Layout nicht.
Kann mir bitte jemand sagen warum und wie man es richtig über Code erzeugt.mainwindow.h:
#ifndef MAINWINDOW_H #define MAINWINDOW_H #include <QMainWindow> #include <QPushButton> #include <QHBoxLayout> class MainWindow : public QMainWindow { Q_OBJECT QPushButton *pushButton1, *pushButton2; QHBoxLayout *Layout; public: MainWindow(QWidget *parent = 0); ~MainWindow(); }; #endif // MAINWINDOW_H
mainwindow.cpp:
#include "mainwindow.h" MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent) { setGeometry(40,40,400,400); pushButton1 = new QPushButton(this); pushButton2 = new QPushButton(this); Layout = new QHBoxLayout; Layout->addWidget(pushButton1); Layout->addWidget(pushButton2); setLayout(Layout); } MainWindow::~MainWindow() { }
main.cpp:
#include "mainwindow.h" #include <QApplication> int main(int argc, char *argv[]) { QApplication a(argc, argv); MainWindow w; w.show(); return a.exec(); }
-
-
Das Programm lässt sich ausführen, aber das Layout wird nicht angewendet.
In der mainwindow.cpp wird also:setGeometry(40,40,400,400);
angewendet, aber
setLayout(Layout);
nicht.
-
wird nicht angewendet
ist auch nicht wirklich aussagekräftig.
Hier werden die Buttons ohne Parentzeiger erzeugt.
-
Bei folgendem Programm funktioniert es und ein Layout wird erzeugt.
Allerdings ist das eine Qt Konsolenanwendung.#include <QApplication> #include <QPushButton> #include <QHboxLayout> int main(int argc, char *argv[]) { QApplication a(argc, argv); QWidget *window = new QWidget; QPushButton *pushButton1 = new QPushButton("Eins"); QPushButton *pushButton2 = new QPushButton("Zwei"); QHBoxLayout *layout = new QHBoxLayout; layout->addWidget(pushButton1); layout->addWidget(pushButton2); window->setLayout(layout); window->show(); return a.exec(); }
Aber warum es bei einer Qt Widgets Anwendung nicht funktoniert verstehe ich nicht.
-
@theAnfänger77
Konsolenanwendung mit GUI - ist klar.Liest du die Antworten auch mal?
-
Bei dem ersten Programm müssten die beiden Labels eigentlich nebeneinander gezeigt werden.
Das geschieht aber nicht.
Dafür verdeckt das 2. Label das 1.
-
@manni66 sagte in Layout über Code erzeugen:
@theAnfänger77
Liest du die Antworten auch mal?
-
Wegen dem Parentzeiger?
Im Programm oben sind die Buttons doch auch ohne Parentzeiger.Oder wegen der Fehlerbeschreibung?
Es handelt sich um einen reinen Laufzeitfehler.
Meldungen werden keine erzeugt.
-
@theAnfänger77 sagte in Layout über Code erzeugen:
Im Programm oben sind die Buttons doch auch ohne Parentzeiger
???
pushButton1 = new QPushButton(this);
-
Ok.
Aber das muss so sein.
Sonst werden die Buttons doch nicht im Fenster angezeigt.
-
Sonst werden die Buttons doch nicht im Fenster angezeigt.
Jaja, es sei denn, die GUI läuft in einer Konsolenanwendung ..
Ich geb’s auf ...
-
Wir reden von folgender Konsolenanwendung:
.pro Datei:QT -= gui CONFIG += c++11 console CONFIG -= app_bundle # The following define makes your compiler emit warnings if you use # any Qt feature that has been marked deprecated (the exact warnings # depend on your compiler). Please consult the documentation of the # deprecated API in order to know how to port your code away from it. DEFINES += QT_DEPRECATED_WARNINGS # You can also make your code fail to compile if it uses deprecated APIs. # In order to do so, uncomment the following line. # You can also select to disable deprecated APIs only up to a certain version of Qt. #DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000 # disables all the APIs deprecated before Qt 6.0.0 SOURCES += \ main.cpp # Default rules for deployment. qnx: target.path = /tmp/$${TARGET}/bin else: unix:!android: target.path = /opt/$${TARGET}/bin !isEmpty(target.path): INSTALLS += target
main.cpp:
#include <QCoreApplication> int main(int argc, char *argv[]) { QCoreApplication a(argc, argv); return a.exec(); }
es handelt sich nicht um ein Projekt ohne Qt, sondern um eine Qt Konsolenanwendung.
-
Der Inhalt von einem QMainWindow ist ein centralWidget. Das musst du erstellen und mit setCentralWidget setzen. Das kann einfach ein QWidget sein, und auf dem wiederum setzt du dein Layout.
Ob parent Zeiger oder nicht ist soweit egal. Wenn ein Widget keinen Parent hat, wird der vom Layout übernommen.
-
Super!
Vielen Dank für die Lösung!So sieht es dann aus:
mainwindow.h:#ifndef MAINWINDOW_H #define MAINWINDOW_H #include <QMainWindow> #include <QPushButton> #include <QHBoxLayout> class MainWindow : public QMainWindow { Q_OBJECT QPushButton *pushButton1, *pushButton2; QHBoxLayout *Layout; QWidget *centralWidget; public: MainWindow(QWidget *parent = 0); ~MainWindow(); }; #endif // MAINWINDOW_H
mainwindow.cpp:
#include "mainwindow.h" MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent) { setGeometry(400,400,1000,1000); pushButton1 = new QPushButton(this); pushButton2 = new QPushButton(this); Layout = new QHBoxLayout; Layout->addWidget(pushButton1); Layout->addWidget(pushButton2); centralWidget = new QWidget; setCentralWidget(centralWidget); centralWidget->setLayout(Layout); } MainWindow::~MainWindow() { }
-
@theAnfänger77 sagte in Layout über Code erzeugen:
centralWidget = new QWidget;
Wieso hat das keinen Parent? Das leckt.
@theAnfänger77 sagte in Layout über Code erzeugen:
MainWindow::~MainWindow() { }
Warum?
-
Nein.
-
@Mechanics hm.
-
@Swordfish sagte in Layout über Code erzeugen:
@theAnfänger77 sagte in Layout über Code erzeugen:
centralWidget = new QWidget;
Wieso hat das keinen Parent? Das leckt.
@theAnfänger77 sagte in Layout über Code erzeugen:
MainWindow::~MainWindow() { }
Warum?
In dem Fall braucht das Widget keinen Parent, weil es über "setCentralWidget" ohnehin zugeordnet wird. Das ist schon ok. Der Form halber könnte man es natürlich trotzdem machen. Die Pushbuttons brauchen glaube auch keinen Parent, weil die ebenfalls über "addWidget" dem Layout zuordnet werden.