今天测试遇到一个奇怪的现象,窗口弹窗后,弹窗和父窗口都不能拖动了,但是窗口里面的UI还在继续,也没有死掉,几经排查,发现是以前的弹窗阻塞了父窗口和新弹出来的窗口。

窗口A、窗口B是两个没有父子关系的窗口,

子窗口d1和子窗口d2是窗口A的两个子窗口,其中d1调用了

setWindowModality(Qt::WindowModal);

会阻塞窗口A和窗口A的子窗口。

窗口B中的按钮触发了窗口A弹出子窗口d1的操作,然后不小心点了窗口B的另一个按钮触发了弹出子窗口d2的操作,d2窗口比较大,正好遮住了窗口d1,导致d1因为被遮住而不能拖动,d2因为与d1同为窗口A的子窗口,导致窗口A和d2都被阻塞,于是窗口A和窗口d1、d2基本废了

解决方案:

如果窗口A弹出d1、d2都是在窗口A中触发,如果先弹出d1,那么由于d1的阻塞,就不会弹出d2

如果先弹出d2,那么由于d1是后弹出的,就不会被d2遮住

所以问题出在窗口A触发的环境,在窗口B触发窗口A的弹窗事件的时候,应该提前判断是否有未结束的模态弹窗,如果有的话,提示用户先完成上一次的弹窗操作。

或者,模态对话框置顶,保证其不会被遮住

如果窗口有边框和标题栏,鼠标操作模态对话框外面的UI的时候,windows窗口会有边框的明暗变化,可以更快的找到窗口拖动不了的原因,

今天测试遇到一个奇怪的现象,窗口弹窗后,弹窗和父窗口都不能拖动了,但是窗口里面的UI还在继续,也没有死掉,几经排查,发现是以前的弹窗阻塞了父窗口和新弹出来的窗口。窗口:窗口A、窗口B是两个没有父子关系的窗口,子窗口d1和子窗口d2是窗口A的两个子窗口,其中d1调用了setWindowModality(Qt::WindowModal);会阻塞窗口A和窗口A的子窗口。操作:窗口B中的按钮触发了窗口A弹出子窗口d1的操作,然后不小心点了窗口B的另一个按钮触发了弹出子窗口d2的操.
Qt 设置 Qt ::FramelessWindowHint后界面无法移动问题的一种解决方案 从别人代码中摘出来的 文章目录 Qt 设置 ` Qt ::FramelessWindowHint`后界面无法移动问题的一种解决方案效果思路代码使用 1. 写 一个 单例 2. 重写事件过滤器 1. 判断鼠标按下事件、鼠标释放事件、鼠标移动事件 2. 移动相应界面 3. qApp 注册过滤器 #ifndef APPINIT_H #define APPINIT_H #include <QObject&
//隐藏 窗口 的标题栏 this->setWindowFlags( Qt ::FramelessWindowHint | Qt ::WindowSystemMenuHint | Qt ::WindowMinMaxButtonsHint); 加了上述代码, 窗口 的标题栏隐藏了,但是不能移动了,解决办法
笔者在按网上的教程学习使用 Qt 制作有美观UI的 窗口 (无边框、圆角、阴影、可 拖动 、可最大化最小化关闭)时,发现了 一个 小问题:在 拖动 窗口 时如果 拖动 到按钮会出现奇怪的瞬移。 按照网上的教程写的 拖动 窗口 部分的代码如下: void Widget::mousePressEvent(QMouseEvent *event) clickPos = event->globalPos() - this->pos();
Redhat 7 Qt 5 模态 对话框Modal Diaog无法移动的问题问题描述GNOME Tweaks工具解决方法 在redhat7 上使用 Qt 5开发软件时,在主界面上弹出 模态 对话框,发现 模态 对话框出现无法移动的问题,挡住了主界面的显示内容,这显然给软件的使用带来的很大的影响 GNOME Tweaks工具 GNOME Tweaks工具详细介绍 简单来说GNOMETweaks工具就是 一个 用来高度自定义GNOME桌面的工具,为了保证稳定性,这个工具并不直接出现在系统 设置 中,而且默认限制了很多功能。本
测试环境: KUbuntu 20.04, Ubuntu 18.04.4 最近做了 一个 Qt 无边框的程序,发现用 Qt MouseMoveEvent 代码移动窗体,无法移出屏幕. 经过测试,发现就算带有系统边框,也无法移出屏幕,但是按住系统标题栏进行移动就可以. 在网上搜索了很久找到了对应的方法: 原文地址: https://www.byteisland.com/linux- qt -%E6%97%A0%E8%BE%B9%E6%A1%86%E7%AA%97%E4%BD%93%E7%9A%84%E7%..
最近遇到 一个 问题,就是当 一个 Qt 的主 窗口 ,打开另 一个 阻塞的 窗口 时, 拖动 上层 窗口 ,会造成原来的主页花屏,直到关闭上层阻塞页面,原主页面 窗口 才能显示正常。解决方法很简单: this-&gt;setAttribute( Qt ::WA_TranslucentBackground); 使用上面的函数实际上是 设置 窗口 透明,也就解决了 拖动 阻塞 窗口 ,主 窗口 无法刷新造成的花屏了,但是会发现,如果原主 窗口 没有 设...
Qt 中,要实现 窗口 关闭后打开另 一个 窗口 ,可以使用信号与槽机制来实现。 首先,在需要打开的 窗口 类中,我们可以定义 一个 槽函数,用于接收来自其他 窗口 的信号。这个槽函数可以是 一个 普通的成员函数,用于打开新 窗口 。 接下来,在需要关闭的 窗口 类中,在 窗口 关闭的事件中发送 一个 信号。可以使用 窗口 的closeEvent()函数来捕获 窗口 关闭事件,并发出自定义的信号。 然后,在主 窗口 中,创建需要打开的 窗口 对象,并将其信号与关闭 窗口 的槽函数进行连接。可以使用QObject类的connect()函数来实现信号与槽的连接。 最后,运行程序,当关闭原 窗口 时,会触发 窗口 关闭事件,发送关闭信号,从而触发槽函数,打开新的 窗口 。 例如:代码示例 MainWindow.h中定义: class MainWindow : public QMainWindow Q_OBJECT public: MainWindow(QWidget *parent = nullptr); ~MainWindow(); private slots: void openNewWindow(); private: Ui::MainWindow *ui; AnotherWindow *anotherWindow; MainWindow.cpp中实现: MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), ui(new Ui::MainWindow) ui->setupUi(this); anotherWindow = new AnotherWindow(); connect(this, SIGNAL(close()), anotherWindow, SLOT(show())); MainWindow::~MainWindow() delete ui; void MainWindow::openNewWindow() // 打开新 窗口 的逻辑 AnotherWindow.h中定义: class AnotherWindow : public QWidget Q_OBJECT public: AnotherWindow(QWidget *parent = nullptr); ~AnotherWindow(); public slots: void showNewWindow(); private: Ui::AnotherWindow *ui; AnotherWindow.cpp中实现: AnotherWindow::AnotherWindow(QWidget *parent) : QWidget(parent), ui(new Ui::AnotherWindow) ui->setupUi(this); connect(this, SIGNAL(show()), this, SLOT(showNewWindow())); AnotherWindow::~AnotherWindow() delete ui; void AnotherWindow::showNewWindow() // 显示新 窗口 的逻辑 这样,当关闭主 窗口 时,会触发主 窗口 的close()信号,并调用槽函数openNewWindow(),从而执行打开新 窗口 的逻辑。同时,新 窗口 中的槽函数showNewWindow()会在其信号show()被触发时调用,执行显示新 窗口 的逻辑。 ### 回答2: 在 Qt 中,要实现 窗口 关闭后打开另 一个 窗口 ,可以通过以下步骤来实现: 1. 创建两个 窗口 类,比如`MainWindow`和`SecondWindow`。在这两个类的头文件中,使用`#include`指令引入 Qt 相关的头文件,并继承`QMainWindow`类。 2. 在`MainWindow`类中,在构造函数中创建 一个 按钮,并 设置 按钮的文本为"打开 窗口 "。连接按钮的`clicked()`信号到槽函数`openSecondWindow()`。 3. 在`openSecondWindow()`槽函数中,创建 一个 `SecondWindow`类的对象,然后使用`show()`函数显示该 窗口 。 4. 在`SecondWindow`类中,可以继续添加其他 窗口 中需要的控件。 5. 在`MainWindow`的实现文件中,实现`openSecondWindow()`槽函数,通过`SecondWindow`类的构造函数创建 一个 `SecondWindow`类的对象,并显示出来。 6. 编译运行程序后,在`MainWindow`中点击"打开 窗口 "按钮,`SecondWindow` 窗口 将会显示出来。 下面是示例代码: mainwindow.h文件: ```cpp #ifndef MAINWINDOW_H #define MAINWINDOW_H #include <QMainWindow> QT _BEGIN_NAMESPACE namespace Ui { class MainWindow; } QT _END_NAMESPACE class MainWindow : public QMainWindow Q_OBJECT public: MainWindow(QWidget *parent = nullptr); ~MainWindow(); private slots: void openSecondWindow(); private: Ui::MainWindow *ui; #endif // MAINWINDOW_H mainwindow.cpp文件: ```cpp #include "mainwindow.h" #include "ui_mainwindow.h" #include "secondwindow.h" MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent) , ui(new Ui::MainWindow) ui->setupUi(this); QPushButton *button = new QPushButton("打开 窗口 ", this); connect(button, &QPushButton::clicked, this, &MainWindow::openSecondWindow); MainWindow::~MainWindow() delete ui; void MainWindow::openSecondWindow() SecondWindow *secondWindow = new SecondWindow(this); secondWindow->show(); secondwindow.h文件: ```cpp #ifndef SECONDWINDOW_H #define SECONDWINDOW_H #include <QMainWindow> namespace Ui { class SecondWindow; class SecondWindow : public QMainWindow Q_OBJECT public: explicit SecondWindow(QWidget *parent = nullptr); ~SecondWindow(); private: Ui::SecondWindow *ui; #endif // SECONDWINDOW_H_H secondwindow.cpp文件: ```cpp #include "secondwindow.h" #include "ui_secondwindow.h" SecondWindow::SecondWindow(QWidget *parent) : QMainWindow(parent), ui(new Ui::SecondWindow) ui->setupUi(this); SecondWindow::~SecondWindow() delete ui; 以上就是使用 Qt 实现 窗口 关闭后打开另 一个 窗口 的简单示例。通过点击`MainWindow`中的按钮,可以打开 一个 新的`SecondWindow` 窗口 。 ### 回答3: 在 Qt 中,要在关闭 一个 窗口 后打开另 一个 窗口 ,我们可以使用信号与槽机制来实现。首先,我们需要定义两个 窗口 类, 一个 是用于关闭的 窗口 类,另 一个 是要打开的 窗口 类。 在关闭 窗口 类中,我们可以重写closeEvent()函数来捕捉 窗口 关闭事件。在该函数中,我们可以发射 一个 自定义的信号,表示 窗口 已关闭。例如: ```cpp void CloseWindow::closeEvent(QCloseEvent *event) // 发射自定义的关闭信号 emit windowClosed(); // 执行默认的关闭操作 event->accept(); 在打开 窗口 类中,我们可以使用槽函数来接收关闭信号,并在槽函数中实现打开另 一个 窗口 的操作。例如: ```cpp void OpenWindow::openNewWindow() // 创建新的 窗口 对象 NewWindow *newWindow = new NewWindow(); // 显示新的 窗口 newWindow->show(); 接下来,我们需要在主程序中连接信号与槽,并执行 Qt 的事件循环。例如: ```cpp int main(int argc, char *argv[]) QApplication a(argc, argv); // 创建关闭 窗口 对象 CloseWindow *closeWindow = new CloseWindow(); // 创建打开 窗口 对象 OpenWindow *openWindow = new OpenWindow(); // 连接关闭信号与打开槽函数 QObject::connect(closeWindow, SIGNAL(windowClosed()), openWindow, SLOT(openNewWindow())); // 显示关闭 窗口 closeWindow->show(); // 执行 Qt 的事件循环 return a.exec(); 这样,当关闭 窗口 被关闭时,就会发射关闭信号,触发打开槽函数,在槽函数中实现打开另 一个 窗口 的操作。