QStackedWidget 将 QActions 连接到 QWidget 的自定义 QGraphicsView

Posted

技术标签:

【中文标题】QStackedWidget 将 QActions 连接到 QWidget 的自定义 QGraphicsView【英文标题】:QStackedWidget connect QActions to custom QGraphicsView of QWidget 【发布时间】:2019-11-22 12:17:25 【问题描述】:

我创建了一个MainWindow 和一个QStackedWidget 和一个QMenuBar。 我的一个小部件包含一个QGraphicsView,我将它提升为我的自定义QGraphicsView (DrawingView)。 我想将 menuBar 中的 QActions 连接到我的自定义 DrawingView

我设法让连接到小部件的QActions 工作,但我不知道如何访问来自DrawingView 的方法。

这是我用于其他QActions的代码:

draw  = qobject_cast<Drawing*>(ui->stackedWidget->widget(1));
connect(ui->actionOpen, &QAction::triggered, draw, &Drawing::openPhoto);
connect(ui->actionSave, &QAction::triggered, draw, &Drawing::saveFile);
connect(ui->actionExit, &QAction::triggered, draw, &Drawing::close);

我为 DrawingView 尝试了这个,但我知道它只是创建了一个新的 DrawingView,而不是使用 Draw ui 中的那个。

drawView = new DrawingView();
connect(ui->actionZoom_In, &QAction::triggered, drawView, &DrawingView::zoomIn);
connect(ui->actionZoom_Out, &QAction::triggered, drawView, &DrawingView::zoomOut);

我也试过这个,在 ui->stackedWidget->widget(1)->graphicsView 上报错:

drawView = qobject_cast<DrawingView*>(ui->stackedWidget->widget(1)->graphicsView); //also tried (ui->stackedWidget->widget(1)->ui->graphicsView)
connect(ui->actionZoom_In, &QAction::triggered, drawView, &DrawingView::zoomIn);
connect(ui->actionZoom_Out, &QAction::triggered, drawView, &DrawingView::zoomOut);

关于如何从 MainWindow 连接或如何访问 MainWindow 的 2nd 小部件内的 ui 的任何帮助。

【问题讨论】:

请考虑发布确切的错误消息。此外,minimal reproducible example 将非常有助于进一步帮助您。 DrawingDrawingView是什么关系? 从 C++ 设置你的用户界面(部分)可能更容易。它使您可以更好地控制如何访问您的特定课程。 或者您可以尝试在 Qt Designer 本身中管理连接。 【参考方案1】:

您的问题不只是 graphicsView 是包含小部件的私有成员吗?

您可以将其设为公共成员或添加包装函数:

auto draw  = qobject_cast<Drawing*>(ui->stackedWidget->widget(1));
connect(ui->actionZoom_In, &QAction::triggered, draw, &Drawing::zomIn);

在绘图类中:

void Drawing::zoomIn() 
    ui->graphicsView.zoomIn();

第三种选择是

从主窗口发出自定义的zoomIn 信号 使主窗口可访问绘图(例如,将其传递给构造函数或创建全局 mainWindow 单例) 直接在绘图中进行连接

【讨论】:

第一个选项非常适合我。非常感谢。

以上是关于QStackedWidget 将 QActions 连接到 QWidget 的自定义 QGraphicsView的主要内容,如果未能解决你的问题,请参考以下文章

将 QStackedWidget 调整为打开的页面[重复]

将没有布局的 QWidget 添加到 QStackedWidget 镶嵌间隙

如何将 QStackedWidget 大小设置为子小部件的最小尺寸?

使用 Qt Creator 中设计的自定义小部件将页面动态添加到 QStackedWidget

为啥 QToolTips 不会出现在 QMenu 中的 QActions 上

QMenu 中用于 QActions 的 QTooltip