** pyqt 多窗口问题 setWindowModality

多窗口模态问题

  • 模态,将用户焦点强制聚焦到当前对话框,使用户无法切换当前Qt应用,保证用户按照设计的逻辑进行操作
Qt.NonModal				# 非模态:正常模式
Qt.WindowModal			# 半模态:窗口级模态对话框,阻塞父窗口、父窗口的父窗口及兄弟窗口
Qt.ApplicationModal		# 模态:应用程序级模态对话框,阻塞整个应用程序的所有窗口

实列

NonModal

qtwin01.py

import sys
from PyQt5.QtWidgets import QMainWindow, QVBoxLayout, QPushButton, QApplication, QWidget, QLineEdit
from PyQt5.QtCore import Qt
from dialog01 import Dialog


class Wind(QMainWindow):
    def __init__(self, parent=None):
        super().__init__(parent)
        self.resize(400, 500)
        layout = QVBoxLayout()
        self.button1 = QPushButton('button1')
        self.button1.clicked.connect(self.show_dialog)
        self.edit = QLineEdit()

        widget = QWidget()
        layout.addWidget(self.button1)
        layout.addWidget(self.edit)
        widget.setLayout(layout)
        self.setCentralWidget(widget)

    def show_dialog(self):
        print('show_dialog')
        dialog = Dialog(self)
        dialog.setWindowModality(Qt.NonModal)
        dialog.show()


if __name__ == '__main__':
    app = QApplication(sys.argv)
    win = Wind()
    win.show()
    sys.exit(app.exec_())
  • dialog01.py
from PyQt5.QtWidgets import QDialog, QVBoxLayout, QLabel, QLineEdit, QApplication
import sys


class Dialog(QDialog):
    def __init__(self, parent=None):
        super().__init__(parent)
        layout = QVBoxLayout()
        label = QLabel('name')
        layout.addWidget(label)
        line_edit = QLineEdit()
        line_edit.setPlaceholderText('input name')
        layout.addWidget(line_edit)
        self.setLayout(layout)
效果
  • 可以切换焦点
    在这里插入图片描述
WindowModal
dialog.setWindowModality(Qt.WindowModal)
效果
  • 无法切换焦点到主窗口

在这里插入图片描述

ApplicationModal
dialog.setWindowModality(Qt.ApplicationModal)
效果
  • 本案例同上

方式2

  • 修改 show_dialog,使用如下方式,也可实现焦点无法切换
    def show_dialog(self):
        print('show_dialog')
        dialog = Dialog()
        dialog.exec_()		# 将qt的线程循环在dialog界面上,导致无法切换焦点
        print('end')

#####效果
在这里插入图片描述

参考

  • 1
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
PyQt6中,可以使用`setWindowModality`方法来设置子窗口的模态性。模态窗口是指在打开的子窗口未关闭之前,无法与其他窗口进行交互。 以下是设置子窗口模态的步骤: 1. 创建子窗口对象。 2. 调用子窗口对象的`setWindowModality`方法,将其模态性设置为所需的模式,例如`Qt.WindowModal`或`Qt.ApplicationModal`。 3. 显示子窗口。 下面是一个示例代码,演示了如何设置子窗口为模态窗口: ```python from PyQt6.QtWidgets import QApplication, QMainWindow, QDialog, QPushButton, QLabel, QVBoxLayout from PyQt6.QtCore import Qt class MainWindow(QMainWindow): def __init__(self): super().__init__() self.setWindowTitle("Main Window") self.button = QPushButton("Open Modal Dialog") self.button.clicked.connect(self.openModalDialog) layout = QVBoxLayout() layout.addWidget(self.button) central_widget = QWidget() central_widget.setLayout(layout) self.setCentralWidget(central_widget) def openModalDialog(self): dialog = QDialog(self) dialog.setWindowTitle("Modal Dialog") dialog.setWindowModality(Qt.WindowModal) # 设置为模态窗口 label = QLabel("This is a modal dialog.") dialog_layout = QVBoxLayout() dialog_layout.addWidget(label) dialog.setLayout(dialog_layout) dialog.exec() app = QApplication([]) window = MainWindow() window.show() app.exec() ``` 在上述示例中,点击"Open Modal Dialog"按钮会打开一个模态对话框,该对话框会阻塞主窗口的交互,直到对话框关闭。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值