Problem: Zugriff von QDialog auf QMainWindow

Alles rund um die Programmierung mit Qt
Antworten
aloha
Beiträge: 1
Registriert: 8. Dezember 2009 21:55

Problem: Zugriff von QDialog auf QMainWindow

Beitrag von aloha »

Hallo,

ich schreibe gerade an einem Programm, hierbei kommt es zum folgenden Problem

Ich habe einen Dialog, der über ein MainWindow aufgerufen wird. Dort sollen über Button Funktionen aus meinem Hauptfenster angesprochen werden.
Diesen Aufbau habe ich versuchsweise mit einem zweiten Window probiert -> da hat es funktioniert.
Aber mit dem Dialog schaffe ich nicht die Funktionen aufzurufen

Kann mir jemand sagen, was ich tun muss, dass er das MainWindow erkennt, von dem es kommt und die Funktionen aufrufen kann?

Folgender Fehler tritt auf:
In file included from testDialog.cpp:8:testDialog.h:16: error: expected `)' before '*' tokentestDialog.cpp:11: error: prototype for `testDialog::testDialog(QMainWindow*)' does not match any in class `testDialog'testDialog.h:13: error: candidates are: testDialog::testDialog()

Code: Alles auswählen

mainWindow.cpp 

#include "mainWindow.h"
#include <QDir>
#include <QMouseEvent>
#include <QMessageBox>
#include <QDesktopWidget>
#include <QRect>


mainWindow::mainWindow() {
    widget.setupUi(this);

    actionImageLoad = rightclickMenu.addAction(tr("Bilder laden"));
    actionMoveRight = rightclickMenu.addAction(tr("Nach Rechts"));
    actionTestDialog = rightclickMenu.addAction(tr("TestDialog"));

    connect(actionImageLoad,SIGNAL(triggered()),this,SLOT(open()));
    connect(actionMoveRight,SIGNAL(triggered()),this,SLOT(moveImageRight()));
    connect(actionTestDialog,SIGNAL(triggered()),this,SLOT(testDialog()));

//other code

  }

mainWindow::~mainWindow() {
}

void mainWindow::open() {
//code zum Laden des Bildes
}

void mainWindow::mouseReleaseEvent(QMouseEvent *event){
    if(event->button() & Qt::RightButton){
        rightclickMenu.popup(event->pos());
    }
}

void mainWindow::moveImageRight(){
//code zum Bewegen des Bildes
}


void mainWindow::testMyDialog(){
//ruft den Dialog auf
    dialog = new testDialog(this);
    dialog->show();
}

Code: Alles auswählen

mainWindow.h


#ifndef _MAINWINDOW_H
#define	_MAINWINDOW_H

#include "ui_mainWindow.h"
#include <QMenu>
#include <testDialog.h>

class mainWindow : public QMainWindow {
    Q_OBJECT
public:
    mainWindow();
    virtual ~mainWindow();    
    void mouseReleaseEvent(QMouseEvent *event);
    void moveImageRight();
private:
    Ui::mainWindow widget;
    QMenu rightclickMenu;
    testDialog *dialog;
    QAction* actionImageLoad;
    QAction* actionQuit;
    QAction* actionTestDialog;
    QAction* actionMoveRight;
    //more stuff
    
private slots:
    void open();
    void testMyDialog();
};

#endif	/* _MAINWINDOW_H */

Code: Alles auswählen

testDialog.h

#ifndef _TESTDIALOG_H
#define	_TESTDIALOG_H

#include "ui_testDialog.h"

class testDialog : public QDialog {
    Q_OBJECT
public:
    testDialog(QMainWindow *parent = 0);
    virtual ~testDialog();
private:
    Ui::testDialog widget;
private slots:
    void moveRight();
    //more stuff
};

#endif	/* _TESTDIALOG_H */

Code: Alles auswählen

testDialog.cpp

#include "testDialog.h"
#include <mainWindow.h>

testDialog::testDialog(QMainWindow *parent): QMainWindow(parent) {
    widget.setupUi(this);
    connect(widget.actionMoveRight,SIGNAL(triggered()),this,SLOT(moveRight()));
}

testDialog::~testDialog() {
}

void testDialog::moveRight(){
    dynamic_cast<mainWindow*>(this->parentWidget())->moveImageRight();
}
franzf
Beiträge: 3114
Registriert: 31. Mai 2006 11:15

Beitrag von franzf »

Da fehlen ja noch einige C++-Essentials...

Z.B. das beißt sich:

Code: Alles auswählen

class testDialog : public QDialog { 

Code: Alles auswählen

testDialog::testDialog(QMainWindow *parent): QMainWindow(parent) 
testDialog ist also ein QDialog.
Warum rufst du dann den QMainWindow-Konstruktor in der Basisinitialisierung auf?!?
Außerdem ist QMainWindow und QDialog in deinem testDialog.h nicht bekannt, Verwendung ausgeschlossen...
Dann noch einen dynamicCast<>() auf von QMainWindow nach mainWindow, was ein ziemlich unperformanter cast ist, wenn du auch gleich einen Pointer selber auf ein mainWindow speichern könntest.

Mehr hab ich mir nicht angeschaut, aber ich bin mir sicher dass noch mehrere solche Sachen im Code rumliegen...

Also erstmal ein (gutes) Buch zu C++ lesen, dann die Qt-Tutorials durcharbeiten, danach (oder parallel) kannst du an deinem Programm weiterarbeiten.

Grüße
Franz
Antworten