python - QFileDialog opens in new window while adding it to QHBoxLayout

标签 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.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)

最佳答案

根据docs :

Window flags are a combination of a type (e.g. Qt::Dialog) and zero or more hints to the window system (e.g. Qt::FramelessWindowHint).

If the widget had type Qt::Widget or Qt::SubWindow and becomes a window (Qt::Window, Qt::Dialog, etc.), it is put at position (0, 0) on the desktop. If the widget is a window and becomes a Qt::Widget or Qt::SubWindow, it is put at position (0, 0) relative to its parent widget.

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

docs给出以下列表:

Qt::Widget: This is the default type for QWidget. Widgets of this type are child widgets if they have a parent, and independent windows if they have no parent. See also Qt::Window and Qt::SubWindow.

Qt::Window: Indicates that the widget is a window, usually with a window system frame and a title bar, irrespective of whether the widget has a parent or not. Note that it is not possible to unset this flag if the widget does not have a parent.

Qt::Dialog :Window Indicates that the widget is a window that should be decorated as a dialog (i.e., typically no maximize or minimize buttons in the title bar). This is the default type for QDialog. If you want to use it as a modal dialog, it should be launched from another window, or have a parent and used with the QWidget::windowModality property. If you make it modal, the dialog will prevent other top-level windows in the application from getting any input. We refer to a top-level window that has a parent as a secondary window.

Qt::Sheet: Window Indicates that the window is a Macintosh sheet. Since using a sheet implies window modality, the recommended way is to use QWidget::setWindowModality(), or QDialog::open(), instead.

Qt::Drawer: Window Indicates that the widget is a Macintosh drawer.

Qt::Popup : Window Indicates that the widget is a pop-up top-level window, i.e. that it is modal, but has a window system frame appropriate for pop-up menus.

Qt::Tool: Window Indicates that the widget is a tool window. A tool window is often a small window with a smaller than usual title bar and decoration, typically used for collections of tool buttons. If there is a parent, the tool window will always be kept on top of it. If there isn't a parent, you may consider using Qt::WindowStaysOnTopHint as well. If the window system supports it, a tool window can be decorated with a somewhat lighter frame. It can also be combined with Qt::FramelessWindowHint.

On Mac OS X, tool windows correspond to the Floating class of windows. This means that the window lives on a level above normal windows; it impossible to put a normal window on top of it. By default, tool windows will disappear when the application is inactive. This can be controlled by the Qt::WA_MacAlwaysShowToolWindow attribute.

Qt::ToolTip:Window Indicates that the widget is a tooltip. This is used internally to implement tooltips.

Qt::SplashScreen: Window Indicates that the window is a splash screen. This is the default type for QSplashScreen.

Qt::Desktop:Window Indicates that this widget is the desktop. This is the type for QDesktopWidget.

Qt::SubWindow: Indicates that this widget is a sub-window, such as a QMdiSubWindow widget.

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

关于python - QFileDialog opens in new window while adding it to QHBoxLayout,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45804961/

相关文章:

Python PyQt5 - 是否可以添加一个按钮在 QTreeView 内按下?

Python "in"算子速度

python - signal clicked 仅适用于静态方法

python - 从外部函数访问 QLCDNumber 对象

python - PyQt:使用线程访问对象

python - 在 Windows 7 中安装 PyQt5

python爬虫ieee论文关键词

python - 如何将标题行添加到 Pandas DataFrame

python - django 模板性能

python - PyQt5 显示全屏对话框