2010-03-22 8 views
4

J'ai besoin d'un QDialog pour envoyer un signal pour redessiner la fenêtre principale.
Mais connecter a besoin d'un objet auquel se connecter.
Je dois donc créer chaque boîte de dialogue avec new et mettre explicitement un connect() à chaque fois. Ce dont j'ai vraiment besoin, c'est d'envoyer simplement MainWindow :: Redraw() depuis n'importe quelle fonction et d'avoir un seul connect() dans Mainwindow pour les recevoir.Qt envoyer le signal à la fenêtre principale de l'application

Mais vous ne pouvez pas rendre un signal statique et les boîtes de dialogue n'héritent évidemment pas de MainWindow.

modifier:
Merci - Je ne veux pas contourner le signal/slots. Je veux éviter d'avoir un pointeur d'application principal singleton, comme afxGetApp(). Mais je ne comprends pas comment envoyer un signal et le faire monter (ou baisser?) Vers la fenêtre principale où je l'attrape. J'ai imaginé des signaux/slots comme des exceptions

+0

Vous comprenez mal comment les signaux/slots travail. Il n'y a pas de concept de "capture" des signaux non manipulés comme s'il s'agissait d'exceptions. Pourquoi voulez-vous éviter d'utiliser une méthode statique pour revenir à la fenêtre principale? Dans ce cas, c'est beaucoup plus facile et c'est ce qui est là pour ... –

+0

Merci, c'est là que je me trompais. Je pensais qu'un signal était plus Qt-ish que juste un getApp global :: redraw() – user280760

+0

@Downvoter: Ne pas downvote juste pour les connaissances manquantes. –

Répondre

3

Permet aux clients de publier CustomRedrawEvents dans QCoreApplication.

class CustomRedrawEvent : public QEvent 
{ 
public: 
    static Type registeredEventType() { 
     static Type myType 
      = static_cast<QEvent::Type>(QEvent::registerEventType()); 
     return myType; 
    }  

    CustomRedrawEvent() : QEvent(registeredEventType()) { 
    } 
}; 

void redrawEvent() { 
    QCoreApplication::postEvent(
     QCoreApplication::instance(), 
     new CustomRedrawEvent()); 
} 

Installer un événement sur l'instance CoreApplication et connecter au signal de redessiner:

class CustomRedrawEventFilter : public QObject 
{ 
    Q_OBJECT 
public: 
    CustomRedrawEventFilter(QObject *const parent) : QObject(parent) { 
    } 

signals: 
    void redraw(); 

protected: 
    bool eventFilter(QObject *obj, QEvent *event) { 
     if(event && (event->type()==CustomRedrawEvent::registeredEventType())) { 
      emit redraw(); 
      return true; 
     } 
     return QObject::eventFilter(obj, event); 
    } 
}; 

//main() 
QMainWindow mainWindow; 
QCoreApplication *const coreApp = QCoreApplication::instance(); 
CustomRedrawEventFilter *const eventFilter(new CustomRedrawEventFilter(coreApp)); 
coreApp->installEventFilter(eventFilter); 
mainWindow.connect(eventFilter, SIGNAL(redraw()), SLOT(update())); 
1

Un moyen facile de faire cela serait d'appeler simplement repaint() sur tous les widgets renvoyés par la méthode statique QApplication :: topLevelWidgets(). Cela évite d'avoir à utiliser des signaux et des slots.

+0

Bonne solution ... – JimDaniel

+0

Utilisez qApp-> pour obtenir un pointeur global vers l'application principale –

0

Si vous souhaitez contourner l'idiome Qt normal, vous pouvez fournir un pointeur global à la fenêtre principale. Cela devrait vous donner la fonctionnalité dont vous avez besoin, si je vous ai bien compris.

Questions connexes