Seite 1 von 1

Aus Funktion heraus Hauptfenster ändern.

Verfasst: 3. Februar 2010 16:08
von kannaum
Hallo erstmal,

Ich pobiere gerade ein Programm zu programmieren, mit dem man solche nervigen Türme die man aus der Schule kennt machen.

Bis jetzt habe ich ein Menü mit 2 Einträgen.
1. Neu (Wird ein Dialog gestartet, wo man aus mehreren Sachen auswählen kann)
2. Beenden (Funtkioniert normal).

Ich will wenn man beim Dialog Turm auswählt, dass dann im Hauptfenster ein Button oder irgendetwas anders kommt.

Wie kann ich das machen?


Meine Codes:
mathematik.h :

Code: Alles auswählen

#ifndef MATHEMATIK_H
#define MATHEMATIK_H
#include <QWidget>
#include <QMainWindow>
#include <QTextEdit>
#include <QMenu>
#include <QMenuBar>
#include <QToolBar>
#include <QMessageBox>
#include <QInputDialog>
#include <QObject>
#include <QLabel>
#include <QVBoxLayout>
#include <QGroupBox>
#include <QPushButton>
#include <QTabWidget>
#include <QTabBar>
#include <QLineEdit>

class mathematik : public QMainWindow {
Q_OBJECT
public:
    mathematik( QMainWindow *parent = 0, Qt::WindowFlags flags = 0);
private:
public slots:
    void neu();
};

#endif // MATHEMATIK_H

mathematik.cpp:

Code: Alles auswählen

#include "mathematik.h"
#include <QApplication>
#include <QInputDialog>
#include <QMessageBox>

mathematik::mathematik( QMainWindow *parent, Qt::WindowFlags flags) : QMainWindow(parent, flags) {
    setWindowTitle("Notizen");
    QMenu *fileMenu = new QMenu(tr("&Datei"), this);
    menuBar()->addMenu(fileMenu);
    fileMenu->addAction(tr("&Neu"), this, SLOT(neu()),QKeySequence(tr("F1", "Neu")));
    fileMenu->addAction(tr("&Beenden"), qApp, SLOT(quit()),QKeySequence(tr("F4", "Beenden")));
}

void mathematik::neu() {
    bool ok;
QStringList items;
items << "Turm" << "Test";
QString itemvalue = QInputDialog::getItem(
   this,"","Was möchten sie machen?",
   items, 0, false, &ok );
if(ok) {

[color=red]//Um das hier gehts.[/color]

}
}

main.cpp :

Code: Alles auswählen

#include <QApplication>
#include "mathematik.h"

int main(int argc, char *argv[]) {
    QApplication app(argc, argv);
    mathematik* window = new mathematik;
    window->show();
    return app.exec();
}

Falls das was ändert, ich verwende den Creator.


mfg[/code]

Verfasst: 5. Februar 2010 19:34
von kannaum
Weiß das keiner?

Verfasst: 5. Februar 2010 20:32
von Kay
Einen QPushButton in einem Layout als CentralWidget im Mainwindow? Oder du malst dein Fenster als ui im Designer und lädst dieses zum entsprechenden Zeitpunkt.

Verfasst: 6. Februar 2010 09:40
von kannaum
Kay hat geschrieben:Einen QPushButton in einem Layout als CentralWidget im Mainwindow?
Genau das.

mfg

Verfasst: 9. Februar 2010 16:42
von kannaum
Weiß das keiner?

mfg

Verfasst: 9. Februar 2010 18:09
von Kay
Was musst du noch wissen?

Du erstellst einfach ein Layout oder von mir aus ein Widget mit nem Layout, falls du später noch andere Sachen auf deinem MainWindow anordnen möchtest und fügst dem Layout den erstellten PushButton hinzu. Und anschließend benutzt du die Memberfunktion des MainWindow "setCentralWidget()" mit dem Layout oder dem erstellten Widget.

Alternativ zeichnest du im Designer ein UI und lädst es im Mainwindow mit Ui::MyUi *ui;
....
ui = new Ui::MyUi;
ui->setupUi(this);

Oder so ähnlich. Je nachdem.

Oder hab ich da jetzt was falsch verstanden? Theoretisch gibt es dazu ja auch Tutorials in der Doku.

Verfasst: 10. Februar 2010 14:00
von kannaum
Das funktioniert aber leider irgendwie nicht.
Ich habe meinen Code um folgende Zeilen erweitert:

mathematik.h:

Code: Alles auswählen

private:
    QPushButton *enter;
    QGridLayout* layoutturm;
und die mathematik.cpp:

Code: Alles auswählen

if(ok) {
    if(itemvalue == "Turm") {
    enter = new QPushButton("Enter");
    layoutturm = new QGridLayout;
    layoutturm->addWidget(enter,0,0);
    setCentralWidget(layoutturm);
}
}
Die Fehlermeldung:
no matching function for call to "mathematik::setCentralWidget(QGridLayout*&)"
Schon mal danke im Vorraus.

mfg

Verfasst: 10. Februar 2010 16:43
von Kay
Die Funktion setCentralWidget(QWidget *widget) funktioniert nur mit Widgets. Layouts erben glaube ich nicht von QWidget und deswegen funktioniert das nicht so einfach wie du das vor hast.

Bei meinem letzten Projekt habe ich als CentralWidget ein QSplitter-Objekt benutzt. Das hat funktioniert.

Du könntest einfach (sofern du noch nichts anderes vorbereitet hast) ein QWidget erstellen mit deinem MainWindow als parent und dein Layout mittels QWidget->setLayout() dem QWidget zuweisen.
Indem dein MainWindow das Parent deines Widgets ist, müsste es auch gleich angezeigt werden. Ansonsten wieder setCentralWidget() probieren ;)

Das wäre jetzt mein Vorschlag. Solange du keine ui-Datei verwendest / verwenden willst, ist so ein dynamisches User Interface manchmal schon ne ganz schöne Bastelei. Also: nur die Ruhe ;)

Verfasst: 10. Februar 2010 18:04
von christophr
Der Code vom uic legt im QMainWindow doch schon ein centralWidget an. Wenn man nichts macht, ist es halt leer. IMHO müsste daher ein

Code: Alles auswählen

mathematik::setLayout( layoutturm );
reichen. Steht aber auch so in der Doku.

Da ich grad eh einen Knoten im Hirn hab gibts die Doku sogar umsonst:
http://qt.nokia.com/doc/4.6/qlayout.html#addItem
http://qt.nokia.com/doc/4.6/qwidget.html#setLayout

Verfasst: 10. Februar 2010 18:26
von kannaum
Kay hat geschrieben:Die Funktion setCentralWidget(QWidget *widget) funktioniert nur mit Widgets. Layouts erben glaube ich nicht von QWidget und deswegen funktioniert das nicht so einfach wie du das vor hast.

Bei meinem letzten Projekt habe ich als CentralWidget ein QSplitter-Objekt benutzt. Das hat funktioniert.

Du könntest einfach (sofern du noch nichts anderes vorbereitet hast) ein QWidget erstellen mit deinem MainWindow als parent und dein Layout mittels QWidget->setLayout() dem QWidget zuweisen.
Indem dein MainWindow das Parent deines Widgets ist, müsste es auch gleich angezeigt werden. Ansonsten wieder setCentralWidget() probieren ;)

Das wäre jetzt mein Vorschlag. Solange du keine ui-Datei verwendest / verwenden willst, ist so ein dynamisches User Interface manchmal schon ne ganz schöne Bastelei. Also: nur die Ruhe ;)
Poa sorry.
Ich bin noch totaler Anfänger.
Könntest du mir evtl. ein Beispiel geben?
Das wäre wirklich sehr nett.

mfg

Verfasst: 11. Februar 2010 10:35
von Kay
Hi,

Folgender Code stellt einen PushButton in deinem MainWindow dar:
[code]#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QtGui/QMainWindow>
#include <QGridLayout>
#include <QWidget>
#include <QPushButton>

class MainWindow : public QMainWindow
{
Q_OBJECT

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

private:
QGridLayout *Layout;
QWidget *Widget;
QPushButton *Button;
};

#endif // MAINWINDOW_H
[/code]

Und die cpp-Datei:
[code]#include "mainwindow.h"

MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
{
Widget = new QWidget(this);
Layout = new QGridLayout;
Button = new QPushButton;

Layout->addWidget(Button, 1, 1, 1, 1, Qt::AlignCenter);
Widget->setLayout(Layout);
}

MainWindow::~MainWindow()
{

}
[/code]

Das ganze funktioniert dynamisch. Kann man also an beliebiger Stelle machen. Sieht aber halt noch nicht schön aus im Hauptprogramm, aber das kriegst du ja auch selbst hin ;)

Grüße,
Kay

Verfasst: 11. Februar 2010 18:49
von kannaum
Es funktioniert aber leider noch immer nicht :cry:

Es wird wohl ausgeführt aber es erscheint wieder nichts, wenn ich Turm auswähle und auf Ok drücke.

Noch einmal der dazugehörige veränderte Code:

Code: Alles auswählen

if(ok) {
    if(itemvalue == "Turm") {
    Widget = new QWidget(this);
    enter = new QPushButton("Enter");
    layoutturm = new QGridLayout;
    layoutturm->addWidget(enter,1,1,1,1, Qt::AlignCenter);
    Widget->setLayout(layoutturm);
}
}
mfg

Verfasst: 11. Februar 2010 23:56
von Kay
Hm, dann weiß ichs jetzt auch nicht genau. Was genau funktioniert nicht? Schon mal n Debgger durchlaufen lassen, ob alles so ausgeführt wird, wie du willst? Kannst du vielleicht den ganzen Code posten? Dann könnte ich ihn ausprobieren. Und hast du schon setCentralWidget() probiert?