2010-03-22 303 views
4

我需要一個QDialog發送信號來重畫主窗口。
但連接需要一個對象來連接。
所以我必須用new創建每個對話框,並且每次都明確地放置一個connect()。Qt發送信號到主應用程序窗口

我真正需要的是一種從任何函數內部發送MainWindow :: Redraw()並在Mainwindow中有一個connect()來接收它們的方法。

但是你不能使信號變成靜態的,對話顯然不能從MainWindow繼承。

編輯:
謝謝 - 我不想繞過信號/插槽。我想繞過一個主要的應用程序指針單例,像afxGetApp()。但是我不明白怎麼發出一個信號,並將它彙集到(或向下?)到主窗口,我可以在那裏找到它。我像是例外地描繪信號/插槽

+0

你誤解如何信號/插槽工作。沒有「捕捉」未處理的信號的概念,就好像它們是例外情況一樣。爲什麼你想避免使用靜態方法返回到主窗口?在這種情況下,它更容易,這就是它的存在... – 2010-03-22 20:27:32

+0

謝謝你是我出錯的地方。我雖然信號不僅僅是一個全球性的getApp :: redraw() – user280760 2010-03-22 20:50:06

+0

@Downvoter:不要爲了缺少的知識而冷靜下來。 – 2010-03-22 20:55:09

回答

3

讓客戶將CustomRedrawEvents發佈到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()); 
} 

在CoreApplication實例上安裝一個事件,並連接到重繪信號:

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

一個簡單的方法就是簡單地調用由靜態方法QApplication :: topLevelWidgets()返回的所有小部件的repaint()。這避免了使用信號和插槽的需要。

+0

良好的解決方案... – JimDaniel 2010-03-22 20:09:18

+0

使用qApp->獲得一個全局指針到主應用程序 – 2010-03-26 21:21:14

0

如果您正在尋找正常的Qt習慣用法,那麼您可以提供一個指向mainwindow的全局指針。如果我能正確理解你,那應該給你所需要的功能。