如何制作一个占据整个屏幕但不最大化的窗口?

7

我正在使用Qt编写Python代码

我想创建一个带有装饰的应用程序窗口并占据全屏大小。目前这是我拥有的代码:

avGeom = QtGui.QDesktopWidget().availableGeometry()
self.setGeometry(avGeom)

问题是它忽略了窗口装饰,所以框架更大......我进行了谷歌搜索等等,找到了这个网址:http://harmattan-dev.nokia.com/docs/library/html/qt4/application-windows.html#window-geometry,看起来我需要将frameGeometry设置为avGeom,但我还没有找到一种方法来做到这一点。另外,在上面链接的评论中,它说我要找的东西可能根本不可能,因为程序在运行之前无法设置frameGeometry...如果是这样,我只想确认我的问题无法解决。
编辑:
所以我对代码进行了一些调整,这可以得到我想要的结果......但数字24基本上是通过试错直到窗口标题可见....我想要更好的方法来做到这一点....这是独立于窗口管理器的。
avGeom = QtGui.QDesktopWidget().availableGeometry()
avGeom.setTop(24)
self.setGeometry(avGeom)

现在我可以通过不断尝试来做我想做的事情

正在使用Ubuntu系统,使用Spyder作为IDE

谢谢


根据我的看法,这就是答案! https://dev59.com/y2w15IYBdhLWcg3wi8Zv - karelv
2个回答

11

使用QtGui.QApplication().desktop().availableGeometry()来获取窗口的大小:

#!/usr/bin/env python
#-*- coding:utf-8 -*-

from PyQt4 import QtGui, QtCore

class MyWindow(QtGui.QWidget):
    def __init__(self, parent=None):
        super(MyWindow, self).__init__(parent)

        self.pushButtonClose = QtGui.QPushButton(self)
        self.pushButtonClose.setText("Close")
        self.pushButtonClose.clicked.connect(self.on_pushButtonClose_clicked)

        self.layoutVertical = QtGui.QVBoxLayout(self)
        self.layoutVertical.addWidget(self.pushButtonClose)

        titleBarHeight = self.style().pixelMetric(
            QtGui.QStyle.PM_TitleBarHeight,
            QtGui.QStyleOptionTitleBar(),
            self
        )

        geometry = app.desktop().availableGeometry()
        geometry.setHeight(geometry.height() - (titleBarHeight*2))

        self.setGeometry(geometry)

    @QtCore.pyqtSlot()
    def on_pushButtonClose_clicked(self):
        QtGui.QApplication.instance().quit()

if __name__ == "__main__":
    import sys

    app = QtGui.QApplication(sys.argv)
    app.setApplicationName('MyWindow')

    main = MyWindow()
    main.show()

    sys.exit(app.exec_())

不,这不起作用...现在发生了什么是,小部件的大小与整个屏幕一样大,而不是整个屏幕减去菜单栏(始终在屏幕上的开始类型按钮)...理想情况下,我希望所有内容减去菜单栏再减去标题所需的空间(也称装饰)。 - evan54
还不是我想要的...我并不想隐藏标题栏,我只是希望我设置的几何图形能考虑到有标题栏的因素...如果我让你感到困惑,对不起。 - evan54
@evan54,我的回答没有包含setWindowFlags部分是否解决了你的问题? - user1006989
是啊,那是什么神奇的操作!我正在努力理解你的代码在做什么... 为什么不直接使用 QtGui.QStyle.PM_TitleBarHeight - evan54
虽然我稍微修改了你的代码,但我使用了 avGeom.setTop(titlebarheight) - evan54
显示剩余5条评论

4

我一直觉得从QMainWindow类继承非常有用。就像这样:

import sys
from PySide.QtGui import *
from PySide.QtCore import *


class Some_APP(QMainWindow):

    def __init__(self):
        super().__init__()
        self.initUI()

    def initUI(self):
        ### this line here is what you'd be looking for
        self.setWindowState(Qt.WindowMaximized)
        ###
        self.show()


def main():
    app = QApplication(sys.argv)
    some_app = Some_APP()
    sys.exit(app.exec_())


if __name__ == "__main__":
    main()

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接