Seite 1 von 1

KindFenster aus einem QMainWindow heraus öffnen

Verfasst: 14. Mai 2009 21:42
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

Verfasst: 14. Mai 2009 21:46
von franzf
openQuestionWidget ist als SIGNAL deklariert. Das darfst du nicht implementieren!! Du wolltest das aber glaub ihc als SLOT haben, oder?

Verfasst: 15. Mai 2009 08:07
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?

Verfasst: 15. Mai 2009 08:43
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

Verfasst: 15. Mai 2009 13:50
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

Verfasst: 16. Mai 2009 09:06
von Luftballon
Komisch. Nach einem Neustart von Windows funktioniert das Programm wunderbar.

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