Qt中怎样阻塞父窗口部分控件,而不完全阻塞父窗口所有控件??

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Qt中怎样阻塞父窗口部分控件,而不完全阻塞父窗口所有控件??相关的知识,希望对你有一定的参考价值。

setWindowModality(Qt::WindowModal)会阻塞父窗口所有控件的输入

参考技术A

    阻塞部分控件, 是指阻塞信号吗?

    阻塞信号可以使用eventFilter, 当出现某控件的某信号时,可以捕获此信号

参考技术B 建议你手动对需要禁用的控件setEnabled(false),然后对话框用非模式的 参考技术C 那你只能设置弹出窗口为非模态,手动将父窗口的控件disable

Qt:如何创建一个不最小化且不阻塞后台GUI的窗口

【中文标题】Qt:如何创建一个不最小化且不阻塞后台GUI的窗口【英文标题】:Qt:How to create a Window that does not minimize and do not block background GUI 【发布时间】:2013-04-10 18:48:14 【问题描述】:

我有一个QMainWindow,它是另一个窗口的孩子。当用户单击父窗口中的任意位置时,我不希望子窗口最小化。子窗口应该失去焦点,用户应该能够继续在父窗口上工作。

此功能类似于 libreoffice/excel/openoffice 等中的查找/替换对话框,如下所示。我们可以看到任务栏只显示了父应用程序窗口,而子窗口在任务栏中是不可见的。

QMainWindow 上是否有任何信号可以帮助我实现这一目标?或者最好的方法是什么?

【问题讨论】:

【参考方案1】:

如果您以Dialog 的身份打开新窗口并为其指定父级,则它应该位于父级之上。由于您使用的是QMainWindow,因此您可以将其与构造函数一起传递。如果您决定使用QDialog,请确保使用setModal(False) 使其无模式。否则会阻塞父节点。

一个小例子:

import sys
from PyQt4 import QtGui, QtCore

class Window(QtGui.QMainWindow):
    def __init__(self, parent=None):
        super(Window, self).__init__(parent)

        w = QtGui.QWidget()
        layout = QtGui.QVBoxLayout(w)
        self.button = QtGui.QPushButton('Open Dialog')
        self.text = QtGui.QTextEdit()

        layout.addWidget(self.button)
        layout.addWidget(self.text)

        self.setCentralWidget(w)

        self.button.clicked.connect(self.openDialog)

    def openDialog(self):
        self.dialog = QtGui.QMainWindow(self, QtCore.Qt.Dialog)
        self.dialog.show()

app = QtGui.QApplication(sys.argv)
w = Window()
w.show()
sys.exit(app.exec_())

【讨论】:

以上是关于Qt中怎样阻塞父窗口部分控件,而不完全阻塞父窗口所有控件??的主要内容,如果未能解决你的问题,请参考以下文章

怎样获取一个控件相对于父窗口的坐标位置

Qt:如何创建一个不最小化且不阻塞后台GUI的窗口

Qt中怎样将一个子窗口填充满父窗口,比如,一个QTreeWidget窗口覆盖在一个QWidget窗口上,谢谢

QT 中控件内坐标转换为父窗口坐标或屏幕坐标

QT 中控件内坐标转换为父窗口坐标或屏幕坐标

QT5怎样设置父窗口刷新时,不刷新子窗口?