KindFenster aus einem QMainWindow heraus öffnen

Alles rund um die Programmierung mit Qt
Antworten
Luftballon
Beiträge: 29
Registriert: 10. Mai 2009 20:03

KindFenster aus einem QMainWindow heraus öffnen

Beitrag von Luftballon »

Ich möchte ein Kindfenster, dachte hierfür an ein QWidget, aus dem Hauptfenster (QMainWindow) heraus öffnen. In diesem Fenster möchte ich später ein Formular zum Erstellen von Fragen anzeigen lassen.

Leider kann ich mit den Fehlermeldungen des Compilers nicht viel anfangen:

Code: Alles auswählen

MultipleChoiceCreator/debug/moc_mainwindow.o:-1: error: In function `ZN10MainWindow18openQuestionWidgetEv':
MultipleChoiceCreator/debug/moc_mainwindow.cpp:76: multiple definition of `MainWindow::openQuestionWidget()'
:-1: error: collect2: ld returned 1 exit status
Über eure Hilfe würde ich mich sehr freuen!

Nachfolgend der Code:

main.cpp

Code: Alles auswählen

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

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

Code: Alles auswählen

#include "mainwindow.h"

MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent) {

    // Menü
    QMenu *fileMenu = new QMenu(tr("&Datei"), this);
    menuBar()->addMenu(fileMenu);
    fileMenu->addAction(
        QIcon("./images/cancel.png"),
        tr("Neue Frage..."), this, SLOT(openQuestionWidget()),
        QKeySequence(tr("Ctrl+N", "Datei|Neue Frage")));
    fileMenu->addAction(
        QIcon("./images/cancel.png"),
        tr("Beenden..."), this, SLOT(close()),
        QKeySequence(tr("Ctrl+X", "Datei|Beenden")));


    // Widget
}

MainWindow::~MainWindow() {}

void MainWindow::openQuestionWidget() {
    QuestionWidget* qW = new QuestionWidget(this);
    qW->show();
}

void MainWindow::closeEvent(QCloseEvent *event) {
    int ret = QMessageBox::warning(this, tr("Abfrage"), tr("Wollen Sie die Anwendung beenden?"),
                                   QMessageBox::Ok | QMessageBox::Cancel);
    if(ret == QMessageBox::Ok) {
        event->accept();
    } else {
        event->ignore();
    }
}
mainwindow.h

Code: Alles auswählen

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QtGui>
#include <QtCore>
#include "QuestionWidget.h"

class MainWindow : public QMainWindow {
    Q_OBJECT

    public:
        MainWindow(QWidget *parent = 0);
        ~MainWindow();
    protected:
       void closeEvent(QCloseEvent* event);
    signals:
       void openQuestionWidget();
};

#endif // MAINWINDOW_H
QuestionWidget.cpp

Code: Alles auswählen

#include "QuestionWidget.h"

QuestionWidget::QuestionWidget(QWidget *parent) : QWidget(parent) {

    button0 = new QPushButton("Fenster schliessen...");

    layout = new QGridLayout(this);
    layout->addWidget(button0, 0, 0);

    setLayout(layout);
}

QuestionWidget::~QuestionWidget() {}
QuestionWidget.h

Code: Alles auswählen

#ifndef QUESTIONWIDGET_H
#define QUESTIONWIDGET_H

#include <QtGui>
#include <QtCore>

class QuestionWidget : public QWidget {
    Q_OBJECT

    public:
        QuestionWidget(QWidget *parent = 0);
        ~QuestionWidget();
    private:
        QGridLayout* layout;
        QPushButton* button0;
};

#endif // QUESTIONWIDGET_H
franzf
Beiträge: 3114
Registriert: 31. Mai 2006 11:15

Beitrag von franzf »

openQuestionWidget ist als SIGNAL deklariert. Das darfst du nicht implementieren!! Du wolltest das aber glaub ihc als SLOT haben, oder?
Luftballon
Beiträge: 29
Registriert: 10. Mai 2009 20:03

Beitrag von Luftballon »

Ah ja, natürlich! Vielen Dank, jetzt funktioniert es!

Allerdings wird das QWidget und der Butten darin ganz klein, kaum sichtbar und ohne den Kasten mit dem Kreuz in der rechten oberen Ecke angezeigt.

Was läuft da schief?
franzf
Beiträge: 3114
Registriert: 31. Mai 2006 11:15

Beitrag von franzf »

Du gibst dem Widget ein Parent (also this) aber du bindest es nicht in das Layout ein. Entweder kein parent mitgeben, oder gleich nen QDialog verwenden (wenn du willst auch modal, dann ist der Input ins MainWIndow gesperrt :))

Grüße
Franz
Luftballon
Beiträge: 29
Registriert: 10. Mai 2009 20:03

Beitrag von Luftballon »

Danke für die Antwort!

Ich habe das mit dem "parent weg" mal ausprobiert und es funktionierte wunderbar. Trotzdem habe ich den Rat befolgt und mir QDialog mal angeschaut und mich für diese Lösung entschieden.

Das funktionierte einwandfrei bis ich begonnen habe mehrere QLineEdit hinzuzufügen. Genau genommen kommt es ab "QLineEdit* edit2" zu dem Fehler. Wenn man "edit2" überall mit in den Kommentarblock (siehe unten) verschiebt, dann startet das Programm anstantslos.

Aber so kommt statt des Programms ein Windows-Dialog mit der Meldung:
"MultipleChoiceCreator.exe hat ein Problem festgestellt und muss beendet werden. [...] <Problembericht senden> <Nicht senden>".

Der Compiler gibt keine Fehlermeldung aus und so habe ich keine Idee was das aktuelle Problem ist.

Hat hier jemand eine Idee?

QuestionDialog.cpp

Code: Alles auswählen

#include "QuestionDialog.h"


QuestionDialog::QuestionDialog() {

    label0  = new QLabel("Frage:");
    label1  = new QLabel("Antwort 1:");
    label2  = new QLabel("Antwort 2:");
    label3  = new QLabel("Antwort 3:");
    label4  = new QLabel("Antwort 4:");
    label5  = new QLabel("Antwort 5:");

    edit0   = new QLineEdit;
    edit1   = new QLineEdit;
    edit2   = new QLineEdit;
    /*

    edit3   = new QLineEdit;
    edit4   = new QLineEdit;
    edit5   = new QLineEdit;
*/
    button0 = new QPushButton("Frage speichern...");
    button1 = new QPushButton("Abbrechen...");

    layout = new QGridLayout;

    layout->addWidget(label0, 0, 0);
    layout->addWidget(label1, 1, 0);
    layout->addWidget(label2, 2, 0);
    /*

    layout->addWidget(label3, 3, 0);
    layout->addWidget(label4, 4, 0);
    layout->addWidget(label5, 5, 0);
*/
    layout->addWidget(edit0, 0, 1);
    layout->addWidget(edit1, 1, 1);
    layout->addWidget(edit2, 2, 1);
    /*

    layout->addWidget(edit3, 3, 1);
    layout->addWidget(edit4, 4, 1);
    layout->addWidget(edit5, 5, 1);
*/
    layout->addWidget(button0, 6, 0);
    layout->addWidget(button1, 6, 1);

    setLayout(layout);

    connect( button0, SIGNAL( clicked() ), this, SLOT( accept() ));
    connect( button1, SIGNAL( clicked() ), this, SLOT( reject() ));
}

QuestionDialog::~QuestionDialog() {}

QuestionDialog.h

Code: Alles auswählen

#ifndef QUESTIONDIALOG_H
#define QUESTIONDIALOG_H

#include <QtGui>
#include <QtCore>

class QuestionDialog : public QDialog {
    Q_OBJECT

    public:
        QuestionDialog();
        ~QuestionDialog();
    private:
        QGridLayout* layout;
        QLabel* label0;
        QLabel* label1;
        QLabel* label2;
        QLabel* label3;
        QLabel* label4;
        QLabel* label5;

        QLineEdit* edit0;
        QLineEdit* edit1;
        QLineEdit* edit2;
        /*

        QLineEdit* edit3;
        QLineEdit* edit4;
        QLineEdit* edit5;
*/
        QPushButton* button0;
        QPushButton* button1;
};

#endif // QUESTIONDIALOG_H
Luftballon
Beiträge: 29
Registriert: 10. Mai 2009 20:03

Beitrag von Luftballon »

Komisch. Nach einem Neustart von Windows funktioniert das Programm wunderbar.

Also vielen Dank für eure Antworten! :-)
Antworten