qt c++ 子窗体全屏展示后 再按快捷键 mainwindow中的qaction不能产生信号 导致按快捷键全屏的子窗口不能还原
时间: 2024-02-05 07:10:38 浏览: 140
这个问题可能是因为子窗体全屏展示后,它会将焦点设置为自己,导致快捷键信号无法传递到主窗口。
解决方法可以尝试在子窗体中重写`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 键即可触发还原操作。
相关问题
qt c++ 子窗体全屏展示后 再按快捷键 mainwindow中的qaction不能产生信号 不能还原窗口
可能是因为子窗体全屏展示后,焦点仍然停留在子窗体上,而不是返回到主窗口。因此,需要在子窗体展示全屏前记录当前的焦点窗口,然后在子窗体退出全屏模式时将焦点还原到该窗口。
具体实现方法如下:
1. 在主窗口中记录当前的焦点窗口:
```cpp
QWidget *MainWindow::getCurrentFocusWidget()
{
QWidget *widget = QApplication::focusWidget();
if (!widget || widget == this) {
widget = centralWidget();
}
return widget;
}
```
2. 在子窗体进入全屏模式前,记录当前的焦点窗口:
```cpp
void ChildWindow::enterFullScreen()
{
m_prevFocusWidget = parentWidget()->getCurrentFocusWidget();
// 进入全屏模式
showFullScreen();
}
```
3. 在子窗体退出全屏模式时,将焦点还原到之前的窗口:
```cpp
void ChildWindow::exitFullScreen()
{
// 退出全屏模式
showNormal();
// 将焦点还原到之前的窗口
if (m_prevFocusWidget) {
m_prevFocusWidget->setFocus();
}
}
```
这样做可以确保子窗体退出全屏模式后,焦点会自动还原到之前的窗口,从而保证主窗口中的快捷键能够正常工作。
qt c++ 子窗体全屏展示后 再按快捷键 程序不能接收到信号 不能还原窗口 给出案例
以下是一个简单的Qt C++程序,包含一个主窗口和一个子窗口,可以通过按下F11键来实现子窗口的全屏展示和还原:
```cpp
// mainwindow.h
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QMainWindow>
#include <QShortcut>
#include "subwindow.h"
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
MainWindow(QWidget *parent = nullptr);
~MainWindow();
private:
SubWindow *subWindow;
QShortcut *fullScreenShortcut;
private slots:
void showFullScreen();
void showNormal();
};
#endif // MAINWINDOW_H
// mainwindow.cpp
#include "mainwindow.h"
#include <QMenuBar>
#include <QAction>
#include <QShortcut>
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
{
// 创建子窗口
subWindow = new SubWindow(this);
// 添加子窗口到主窗口中
setCentralWidget(subWindow);
// 创建全屏快捷键
fullScreenShortcut = new QShortcut(QKeySequence(Qt::Key_F11), this);
// 连接全屏信号槽
connect(fullScreenShortcut, &QShortcut::activated, this, &MainWindow::showFullScreen);
}
MainWindow::~MainWindow()
{
delete subWindow;
delete fullScreenShortcut;
}
void MainWindow::showFullScreen()
{
// 判断子窗口是否已经全屏
if(subWindow->isFullScreen())
{
// 如果已经全屏,则还原窗口
subWindow->showNormal();
}
else
{
// 否则全屏窗口
subWindow->showFullScreen();
}
}
void MainWindow::showNormal()
{
// 还原窗口
subWindow->showNormal();
}
// subwindow.h
#ifndef SUBWINDOW_H
#define SUBWINDOW_H
#include <QDialog>
class SubWindow : public QDialog
{
Q_OBJECT
public:
SubWindow(QWidget *parent = nullptr);
~SubWindow();
};
#endif // SUBWINDOW_H
// subwindow.cpp
#include "subwindow.h"
SubWindow::SubWindow(QWidget *parent)
: QDialog(parent)
{
setWindowTitle("Sub Window");
setFixedSize(300, 200);
}
SubWindow::~SubWindow()
{
}
```
在这个例子中,我们使用了`QShortcut`类来创建F11键的快捷键,并且连接了`activated`信号到`showFullScreen()`槽函数。在`showFullScreen()`函数中,我们首先检查子窗口是否已经全屏,如果是,则还原窗口,否则全屏窗口。还原窗口时,我们还连接了一个`showNormal()`槽函数来处理还原窗口的操作。
但是在测试中,我们发现子窗口全屏展示后再按快捷键,程序不能接收到信号,不能还原窗口。为了解决这个问题,我们需要在主窗口的`showNormal()`槽函数中手动调用子窗口的`showNormal()`函数:
```cpp
void MainWindow::showNormal()
{
// 还原窗口
subWindow->showNormal();
// 激活子窗口
subWindow->activateWindow();
}
```
这样就可以解决子窗口全屏展示后再按快捷键无法还原窗口的问题了。完整代码见上述代码块。
阅读全文