代码之家  ›  专栏  ›  技术社区  ›  John Wilkinson

QFileDialog在新窗口中打开,同时将其添加到QHBoxLayout

  •  2
  • John Wilkinson  · 技术社区  · 7 年前

    from PyQt5.QtWidgets import QVBoxLayout, QFileDialog, QPushButton, QWidget
    
    
    class MainWindow(QtWidgets.QWidget):
        def __init__(self):
           super(MainWindow, self).__init__()
           self.setWindowTitle("My own MainWindow")
    
           self.fileDialog = QFileDialog()
    
           self.confirmAction = QPushButton("Press me", self)
    
           mainLayout = QVBoxLayout()
    
           mainLayout.addWidget(self.fileDialog)
           mainLayout.addWidget(self.confirmAction)
           self.setLayout(mainLayout)
    
    2 回复  |  直到 6 年前
        1
  •  1
  •   Community CDub    4 年前

    根据 docs :

    对窗口系统的更多提示(例如Qt::FramelessWindowHint)。

    如果小部件的类型为Qt::widget或Qt::SubWindow并成为 Qt::子窗口,它被放置在相对于其父窗口的位置(0,0) 小装置。

    因此,这些标志用于改变小部件的行为,例如将其转换为窗口、对话框、工具提示等。

    docs

    Qt::小部件 :这是默认值 Qt::窗口和Qt::子窗口。

    Qt::窗口 :表示 条,而不管小部件是否有父项。请注意 如果小部件没有 父母亲

    :窗口指示小部件是一个 键入QDialog。如果您想将其用作模式对话框,它应该 从另一个窗口启动,或者有一个父窗口并与 任何输入。我们指的是一个顶级窗口,其中有一个父窗口作为

    Qt::工作表 :窗口指示 窗口是Macintosh工作表。因为使用图纸意味着窗口 或QDialog::open()。

    :窗口指示 小部件是Macintosh抽屉。

    :Window表示小部件是一个弹出的顶级窗口,即。 它是模态的,但有一个适合弹出窗口的窗口系统框架 菜单。

    :窗口指示小部件是一个 工具窗口。工具窗口通常是具有小于 按钮。如果有父对象,工具窗口将始终保持打开状态 Qt::WindowStaysOnTopHint也是。如果窗口系统支持,则 工具窗口可以用较轻的框架装饰。它可以 还可以与Qt::FramelessWindowHint结合使用。

    不可能在上面放一个普通的窗口。默认情况下,工具

    Qt::工具提示 工具提示。这在内部用于实现工具提示。

    Qt::飞溅屏幕 启动屏幕。这是QSplashScreen的默认类型。

    :窗口指示此小部件是

    Qt::子窗口 例如qmdusubwindows小部件。

    在你的情况下,我们必须改变 Qt::Dialog Qt::Widget ,在以下代码中,我显示了执行此操作的代码:

    class MainWindow(QWidget):
        def __init__(self):
           super(MainWindow, self).__init__()
           self.setWindowTitle("My own MainWindow")
    
           self.fileDialog = QFileDialog(self)
           self.fileDialog.setOption(QFileDialog.DontUseNativeDialog)
           self.fileDialog.setWindowFlags(Qt.Widget)
    
           self.confirmAction = QPushButton("Press me", self)
    
           mainLayout = QVBoxLayout()
    
           mainLayout.addWidget(self.fileDialog)
           mainLayout.addWidget(self.confirmAction)
           self.setLayout(mainLayout)
    

    enter image description here

        2
  •  0
  •   RJVB    6 年前

    我自己也在研究这个问题,对“只使用非母语对话”这一点很不满意。我一直在破解KDE平台文件对话框的实现,已经(卡住)非常接近我想要的。

    我发现唯一的连接点就在对话框实际显示之前;在此之前,似乎没有办法知道实际的父窗口小部件。但我们可以:

    • 查找父QWidget(从父 )
    • 保存原始用户端QFileDialog实例
    • 在dtor中,要么恢复布局中的原始QFD,要么对其调用deleteLater()(如果操作导致递归调用dtor,则将其设置为NULL)。

    -对话框可能以两组确定/取消等按钮结束 -调整大小可以工作,但saveSize/restoreSize机制不能

    此BKO票据的完整补丁: https://bugs.kde.org/show_bug.cgi?id=404833#c15

    显然,这只对黑客和可以发布自己的平台主题插件(KDE平台文件对话框就是从这里来的)的软件有用。幸运的是,这些插件往往相对较小。