Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/289.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python QFileDialog在新窗口中打开,同时将其添加到QHBoxLayout_Python_Pyqt_Pyqt5_Qdialog - Fatal编程技术网

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

Python QFileDialog在新窗口中打开,同时将其添加到QHBoxLayout,python,pyqt,pyqt5,qdialog,Python,Pyqt,Pyqt5,Qdialog,我的问题是,当我将QFileDialog添加到QVBoxLayout时,它会在新窗口中打开。下面是产生我的问题的代码 from PyQt5.QtWidgets import QVBoxLayout, QFileDialog, QPushButton, QWidget class MainWindow(QtWidgets.QWidget): def __init__(self): super(MainWindow, self).__init__() self

我的问题是,当我将QFileDialog添加到QVBoxLayout时,它会在新窗口中打开。下面是产生我的问题的代码

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)
根据报告:

窗口标志是类型(例如Qt::Dialog)和零或零的组合 窗口系统的更多提示(例如Qt::FramelessWindowHint)

如果小部件的类型为Qt::widget或Qt::SubWindow并成为 窗口(Qt::window、Qt::Dialog等),将其置于 桌面。如果小部件是一个窗口,并成为Qt::小部件或 子窗口,它被放置在相对于其父窗口的位置(0,0) 小部件

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

中给出了以下列表:

Qt::Widget:这是默认设置 输入QWidget的类型。这种类型的小部件是子小部件(如果有) 父窗口和独立窗口(如果没有父窗口)。另见 Qt::Window和Qt::SubWindow

Qt::Window:表示 小部件是一个窗口,通常带有窗口系统框架和标题 条,无论小部件是否有父项。注意 如果小部件没有标记,则无法取消设置此标志 家长

Qt::Dialog:窗口指示小部件是 应装饰为对话框的窗口(即,通常为 最大化或最小化标题栏中的按钮)。这是默认设置 输入QDialog的类型。如果要将其用作模式对话框,则应 可以从另一个窗口启动,或具有父窗口并与一起使用 QWidget::windowModality属性。如果将其设置为模态,则对话框 将阻止应用程序中的其他顶级窗口 任何输入。我们指的是一个顶级窗口,它有一个父窗口作为 辅助窗口

Qt::Sheet:窗口指示 窗口是一个麦金塔表。因为使用图纸意味着窗口 模态,建议使用QWidget::setWindowModality(), 或QDialog::open()

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

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

Qt::Tool:窗口指示小部件是 工具窗口。工具窗口通常是具有小于 常用的标题栏和装饰,通常用于工具集 按钮。如果有父级,工具窗口将始终保持打开状态 最重要的是。如果没有家长,你可以考虑使用 Qt::WindowStaysOnTopHint也是。如果窗口系统支持它,则 工具窗口可以用较轻的框架装饰。它可以 也可以与Qt::FramelessWindowHint结合使用

在Mac OS X上,工具窗口对应于浮动窗口类。 这意味着窗口位于高于正常窗口的标高上;信息技术 不可能在上面放一个普通的窗口。默认情况下,工具 当应用程序处于非活动状态时,windows将消失。这可能是 由Qt::WA_MacAlwaysShowToolWindow属性控制

Qt::ToolTip:窗口指示小部件是 工具提示。这在内部用于实现工具提示

Qt::SplashScreen:窗口表示该窗口是一个 启动屏幕。这是QSplashScreen的默认类型

Qt::Desktop:窗口指示此小部件是 桌面。这是QDesktopWidget的类型

Qt::SubWindow:表示此小部件是一个子窗口, 例如QMBwindow小部件

在您的情况下,我们必须将
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)
截图:


我自己也在研究这个问题,对“只使用非本地对话框”这一点很不满意。我已经在KDE平台文件对话框实现中进行了黑客攻击,并且已经非常接近我想要的了

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

  • 查找父QWidget(从父QWidget窗口)
  • 从中获得(第一个)(用户端)QFileDialog实例
  • 如果父QWidget具有布局,则将找到的QFileDialog实例替换为我们自己的对话框
  • 保存原始用户端QFileDialog实例
  • 在dtor中,恢复布局中的原始QFD,或者对其调用deleteLater()(如果操作导致递归调用dtor,则将其设置为NULL)
故障: -对话框可能会以两组确定/取消/等按钮结束 -如果没有,这些按钮实际上可能只关闭嵌入式QFD,而不关闭封闭对话框(见上面链接的python示例) -调整大小可以工作,但saveSize/restoreSize机制不能 -AFAICT所有信号未正确连接(Scribus打开文件对话框中的预览不会对选择文件做出应有的反应)。不过,打开文件确实有效

此BKO票据上的完整补丁:


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

QFileDialog继承自QDialog,创建这些元素是为了创建一个对话框窗口,因此它显示的是正确的。你可以解释你想要得到什么。我想要得到QVBoxLayout QFileDialog中的第一项,以及QFileDialog下面的简单QPushButton中的第二项。我直接的问题是:为什么你想在你的小部件中嵌入QFileDialog?只是为了培训的目的,我想制作这样的小部件,它包含QFileDialog和QP下面的内容