今天测试遇到一个奇怪的现象,窗口弹窗后,弹窗和父窗口都不能拖动了,但是窗口里面的UI还在继续,也没有死掉,几经排查,发现是以前的弹窗阻塞了父窗口和新弹出来的窗口。
窗口B中的按钮触发了窗口A弹出子窗口d1的操作,然后不小心点了窗口B的另一个按钮触发了弹出子窗口d2的操作,d2窗口比较大,正好遮住了窗口d1,导致d1因为被遮住而不能拖动,d2因为与d1同为窗口A的子窗口,导致窗口A和d2都被阻塞,于是窗口A和窗口d1、d2基本废了
今天测试遇到一个奇怪的现象,窗口弹窗后,弹窗和父窗口都不能拖动了,但是窗口里面的UI还在继续,也没有死掉,几经排查,发现是以前的弹窗阻塞了父窗口和新弹出来的窗口。窗口:窗口A、窗口B是两个没有父子关系的窗口,子窗口d1和子窗口d2是窗口A的两个子窗口,其中d1调用了setWindowModality(Qt::WindowModal);会阻塞窗口A和窗口A的子窗口。操作:窗口B中的按钮触发了窗口A弹出子窗口d1的操作,然后不小心点了窗口B的另一个按钮触发了弹出子窗口d2的操.
笔者在按网上的教程学习使用
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->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();
这样,当关闭
窗口
被关闭时,就会发射关闭信号,触发打开槽函数,在槽函数中实现打开另
一个
窗口
的操作。