qt c++ 子窗体全屏展示后 再按快捷键 程序不能接收到信号 不能还原窗口 给出案例
时间: 2023-12-29 16:06:05 浏览: 98
qt--主窗口中按钮弹出子窗口,并把主窗口信号发送给子窗口
5星 · 资源好评率100%
以下是一个简单的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();
}
```
这样就可以解决子窗口全屏展示后再按快捷键无法还原窗口的问题了。完整代码见上述代码块。
阅读全文