2014-03-03 79 views
0

我正在使用MDI的應用程序。我在包含QMDIArea的主窗口中定義了一堆工具箱和菜單欄。Qt MDI信號設計

所有的子窗口都是同一個類。爲了將按鈕連接到活動的子窗口中,我做了如下思考:

void MainWindow::zoomOut() { 
    QMdiSubWindow* sub_window = central_document_interface->currentSubWindow(); 

    if (sub_window) { 
    PlanWindow* plan_window = (PlanWindow*)(sub_window->widget()); 
    plan_window->zoomOut(); 
    } 
} 

我認爲這將是更明智的重新連接使用subWindowActivated信號的信號。但我的問題是,我打算有幾種類型的子窗口(不同的類)。所有這些類都不使用所有信號。

我無法找到一個乾淨的方式來區分他們,並根據他們的類別連接或不連接信號。你會如何做到這一點?

回答

0

我創造了我的項目驗證碼:

void MainWindow::slot_menuEditZoomOut() { 
    WindowAreaManagerInterface::instance()-> 
     LambaOnCurrentCustomWindow<CAbstractZoomAction>([](CAbstractZoomAction *zoom){ zoom->zoomOut(); }); 
} 

凡WindowAreaManagerInterface是

class WindowAreaManagerInterface : public QMdiArea { 
Q_OBJECT 
public: 
static WindowAreaManagerInterface *instance(); 

template<class T> 
T *currentCustomWindow() { 
    QWidget *widget = 0; 
    QMdiSubWindow *subWindow = currentSubWindow(); 
    if (subWindow) widget = subWindow->widget(); 

    return dynamic_cast<T *> (widget); 
} 

template<class T, typename Func> 
void LambaOnCurrentCustomWindow(Func F) { 
    T *window = currentCustomWindow<T>(); 
    if (window) 
     F(window); 
} 
//other methods follow.. 
} 

希望這有助於。