Signal nicht mit QSignalMapper umleiten

Alles rund um die Programmierung mit Qt
Antworten
feldmaus
Beiträge: 32
Registriert: 25. September 2007 21:08

Signal nicht mit QSignalMapper umleiten

Beitrag von feldmaus »

Hallöchen Alle,

entwickle gerade ein Programm in PyQt4. Und zwar soll es eine Mdi Anwendung sein. Leider komme ich mit QSignalMapper nicht zurecht.

Ich werde versuchen das Problem in reinem Qt4 darzustellen.
Ich habe also ein Hauptfenster,

Code: Alles auswählen

#ifndef MAINWINDOW_H
 #define MAINWINDOW_H

 #include <QMainWindow>
 ...
 class QAction;
 class QMenu;
 class QMdiArea;
 class QMdiSubWindow;
 class MdiChild;
 class QSignalMapper;

 class MainWindow : public QMainWindow
 {
     Q_OBJECT

 public:
     MainWindow();

 protected:
     void closeEvent(QCloseEvent *event);

 private slots:
     ...
     void updateMenus();
     void updateWindowMenu();
     MdiChild *createMdiChild();
     ...
     void setActiveSubWindow(QWidget *window);

 private:

     void readSettings();
     void writeSettings();

     QMdiArea *mdiArea;
     QSignalMapper *windowMapper;
     ...
 };

 #endif

Code: Alles auswählen

#include <QtGui>

 #include "mainwindow.h"
 #include "mdichild.h"

 MainWindow::MainWindow()
 {
     mdiArea = new QMdiArea;
     setCentralWidget(mdiArea);
     connect(mdiArea, SIGNAL(subWindowActivated(QMdiSubWindow *)),
             this, SLOT(updateMenus()));
     windowMapper = new QSignalMapper(this);
     connect(windowMapper, SIGNAL(mapped(QWidget *)),
             this, SLOT(setActiveSubWindow(QWidget *)));

     createActions();
     createMenus();
     createToolBars();
     createStatusBar();
     updateMenus();

     readSettings();

     setWindowTitle(tr("MDI"));
 }

 MdiChild *MainWindow::createMdiChild()
 {
     MdiChild *child = new MdiChild;
     mdiArea->addSubWindow(child);

     connect(child, SIGNAL(copyAvailable(bool)),
             cutAct, SLOT(setEnabled(bool)));
     connect(child, SIGNAL(copyAvailable(bool)),
             copyAct, SLOT(setEnabled(bool)));

     return child;
 }

 void MainWindow::readSettings()
 {
     QSettings settings("Trolltech", "MDI Example");
     QPoint pos = settings.value("pos", QPoint(200, 200)).toPoint();
     QSize size = settings.value("size", QSize(400, 400)).toSize();
     move(pos);
     resize(size);
 }

 void MainWindow::writeSettings()
 {
     QSettings settings("Trolltech", "MDI Example");
     settings.setValue("pos", pos());
     settings.setValue("size", size());
 }

 ...

     return 0;
 }
Und das Unterfenster (Mdi-Child),

Code: Alles auswählen

 #ifndef MDICHILD_H
 #define MDICHILD_H

 #include <QTextEdit>

 class MdiChild : public QTextEdit
 {
     Q_OBJECT

 public:
     MdiChild();

     ...

 protected:
     void closeEvent(QCloseEvent *event);

 private slots:
     void documentWasModified();

 private:

     void readSettings();
     void writeSettings();

     ...

 };

 #endif

Code: Alles auswählen

#include <QtGui>

 #include "mdichild.h"

 MdiChild::MdiChild()
 {
     setAttribute(Qt::WA_DeleteOnClose);
     isUntitled = true;
     MdiChild::readSettings()
 }
 
 ...

 void MdiChild::readSettings()
 {
     QSettings settings("Trolltech", "MDI Example");
     QPoint pos = settings.value("pos", QPoint(200, 200)).toPoint();
     QSize size = settings.value("size", QSize(400, 400)).toSize();
     move(pos);
     resize(size);
 }

 void MdiChild::writeSettings()
 {
     QSettings settings("Trolltech", "MDI Example");
     settings.setValue("pos", pos());
     settings.setValue("size", size());
 }

 ...

Die Unterfenster sind Programme, die genau wie das Hauptfenster eine Methode writeSettings() und readSettings() besitzen. Die Methode readSettings() funktioniert, aber die writeSettings() noch nicht, sie soll aufgerufen werden, wenn das Unterfenster geschlossen wird.
1.) Wie mache ich das?
2.) Welches SIGNAL wird gesendet beim schließen eines Fensters?
3.)Kann man über einen Debugger diese SIGNAL's abfangen, um raußzukriegen welches SIGNAL gesendet wurde?

Danke im vorrauß
Grüße Markus
upsala
Beiträge: 3946
Registriert: 5. Februar 2006 20:52
Wohnort: Landshut
Kontaktdaten:

Beitrag von upsala »

Also für mich sieht das ganze ja nach C++ aus...
Welches SIGNAL wird gesendet beim schließen eines Fensters?
WidgetAttribute Qt::WA_DeleteOnClose setzen und das Signal

Code: Alles auswählen

void destroyed(QObject *obj=0)
benutzen.
feldmaus
Beiträge: 32
Registriert: 25. September 2007 21:08

Beitrag von feldmaus »

upsala hat geschrieben: WidgetAttribute Qt::WA_DeleteOnClose setzen und das Signal

Code: Alles auswählen

void destroyed(QObject *obj=0)
benutzen.
Schade hat auch nicht hingehauen.
Das Attribut hatte ich allerdings schon bei mir gesetzt.
Ich poste mal meinen PyQt4 Code.
startGUI.pyw
hauptfenster.py
reisehelfer.py

Mein Problem liegt in dem QSignalMapper.
Ich nehme stark an das das Ereignis meines Unterfensters, aufgrund des QSignalMappers bei dem Hauptfenster versackt. Ich habe es mit dem Debugger pdb getestet, dabei hat er lediglich die Methode MainWindow.updateMenus() ausgeführt, aufgrund der CONNECTION in Zeile 20 in der hauptfenster.py. Beim schließen des Unterfensters wird dieses auch gleichzeitig aktiviert.
Antworten