Python QFileDialog在新窗口中打开,同时将其添加到QHBoxLayout
我的问题是,当我将QFileDialog添加到QVBoxLayout时,它会在新窗口中打开。下面是产生我的问题的代码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
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)
显然,这只对黑客和可以发布自己的平台主题插件的软件有用(KDE平台文件对话框就是从这里来的)。幸运的是,这些插件往往相对较小。QFileDialog继承自QDialog,创建这些元素是为了创建一个对话框窗口,因此它显示的是正确的。你可以解释你想要得到什么。我想要得到QVBoxLayout QFileDialog中的第一项,以及QFileDialog下面的简单QPushButton中的第二项。我直接的问题是:为什么你想在你的小部件中嵌入QFileDialog?只是为了培训的目的,我想制作这样的小部件,它包含QFileDialog和QP下面的内容