qt c++ mdiarea控件的子窗体全屏展示后 再按快捷键 主程序中的QActionui.actionViewerFullScreen不能发射QAction::toggled信号,必须重新点击主界面后才能发射信号
时间: 2024-02-03 20:15:57 浏览: 81
这个问题可能是因为子窗体全屏展示后,焦点仍然在子窗体上,而不是主界面上。因此,快捷键并没有发送到主程序中的QAction。你可以尝试在mdiarea控件的子窗体的全屏模式中,将焦点转移到主程序中的QAction上,这样快捷键就可以发送到QAction了。
具体实现可以在子窗体的全屏模式中,使用QWidget::setFocusProxy()函数将焦点转移到QAction所在的QWidget上。例如,在子窗体的构造函数中添加以下代码:
```cpp
setFocusPolicy(Qt::StrongFocus);
QAction *fullScreenAction = mainWnd->findChild<QAction*>("actionViewerFullScreen");
setFocusProxy(fullScreenAction->parentWidget());
```
其中,mainWnd是主程序的指针,actionViewerFullScreen是主程序中QAction的对象名称。
这样,当子窗体进入全屏模式后,焦点会转移到主程序中的QAction上,快捷键就可以正常发送到QAction了。
相关问题
qt c++ mdiarea控件的子窗体全屏展示后 主程序中的QActionui.actionViewerFullScreen不能发射QAction::toggled信号,必须重新点击主界面后才能发射信号
这个问题可能是由于子窗口全屏后,它会遮盖住主界面中的QAction,导致QAction无法响应点击事件。你可以尝试在子窗口全屏时,将QAction所在的ToolBar隐藏,或者将QAction放在子窗口的ToolBar中。这样可以避免子窗口遮盖住QAction的问题,从而正确地发射信号。
另外,你还可以尝试使用Qt的信号槽机制,将子窗口全屏时的事件连接到主程序中的QAction的toggled信号上,这样可以在子窗口全屏时直接触发QAction的toggled信号。具体实现可以参考以下代码:
```
// 在子窗口中连接全屏事件到主程序中的actionViewerFullScreen的toggled信号上
connect(this, &MySubWindow::windowStateChanged, mainwindow->ui->actionViewerFullScreen, &QAction::toggled);
```
其中,`MySubWindow`是你的子窗口类名,`mainwindow`是你的主程序窗口指针,`mainwindow->ui->actionViewerFullScreen`是你的QAction对象。这样,当子窗口进入全屏状态时,就会自动触发QAction的toggled信号。
qt c++ 子窗体全屏展示后 再按快捷键 mainwindow中的qaction不能产生信号 导致按快捷键全屏的子窗口不能还原
这个问题可能是因为子窗体全屏展示后,它会将焦点设置为自己,导致快捷键信号无法传递到主窗口。
解决方法可以尝试在子窗体中重写`keyPressEvent`函数,将快捷键的事件传递给主窗口。具体实现如下:
```c++
// 子窗体的 keyPressEvent 函数
void SubWindow::keyPressEvent(QKeyEvent *event)
{
if (event->key() == Qt::Key_Escape) {
// 按下 ESC 键时,发送还原信号给主窗口
emit restoreSignal();
event->accept(); // 接受该事件,不再传递
} else {
// 其他键位的事件继续传递
QWidget::keyPressEvent(event);
}
}
```
然后在主窗口中,连接该子窗体的还原信号,执行还原操作即可:
```c++
// 在主窗口中连接子窗体的还原信号
connect(m_subWindow, &SubWindow::restoreSignal, this, &MainWindow::restoreSubWindow);
// 主窗口中还原子窗体的槽函数
void MainWindow::restoreSubWindow()
{
m_subWindow->showNormal(); // 还原子窗体
}
```
这样,当子窗体全屏展示后,按下 ESC 键即可触发还原操作。
阅读全文