Qt MDI信号设计

Qt MDI signal design

本文关键字:信号 MDI Qt      更新时间:2023-10-16

我正在开发一个使用 MDI 的应用程序。我在包含QMDIArea的主窗口中定义了一堆工具箱和菜单栏。

所有子窗口都属于同一类。为了将按钮连接到活动子窗口,我做了以下思考:

void MainWindow::zoomOut() {
  QMdiSubWindow* sub_window = central_document_interface->currentSubWindow();
  if (sub_window) {
    PlanWindow* plan_window = (PlanWindow*)(sub_window->widget());
    plan_window->zoomOut();
  }
}

我认为使用子窗口激活信号重新连接信号会更明智。但是我遇到的问题是我打算有几种类型的子窗口(不同的类)。所有这些类都不会使用所有信号。

我无法找到一种干净的方法来区分它们并根据它们的类别连接或不连接信号。你会怎么做?

我为我的项目创建了以下代码:

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

其中窗口区域管理器界面位于

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..
}

希望这有帮助。