与 QtDesigner 的 window 相比,未正确显示 window

Doesn't show window correctly compared to QtDesigner's window

我正在使用 PyQt5 创建一个 GUI 应用程序,我使用 QtDesigner 创建了 UI 并得到了这个结果:

但这个问题是,当我使用 Python 启动我的应用程序时,根据我使用的屏幕尺寸,应用程序没有正确显示:在我的笔记本电脑上(我从上面截取了 QtDesigner 屏幕截图) ),结果如下:

(白色部分只是为了更明显地显示矩形未正确显示)

如您所见,左侧栏在我的笔记本电脑上显示不正确,但在更大的屏幕上,它显示完美,所以我认为屏幕尺寸是错误因素,但我没有看到我该如何解决。是否有任何我必须确保使用的选项才能避免尺寸问题?

您可以使用以下代码来获得最小的可重现示例:

QtDesigner 生成的代码如下:

# -*- coding: utf-8 -*-

################################################################################
## Form generated from reading UI file 'main_mreZokVTK.ui'
##
## Created by: Qt User Interface Compiler version 5.14.1
##
## WARNING! All changes made in this file will be lost when recompiling UI file!
################################################################################

from PySide2.QtCore import (QCoreApplication, QMetaObject, QObject, QPoint,
    QRect, QSize, QUrl, Qt)
from PySide2.QtGui import (QBrush, QColor, QConicalGradient, QCursor, QFont,
    QFontDatabase, QIcon, QLinearGradient, QPalette, QPainter, QPixmap,
    QRadialGradient)
from PySide2.QtWidgets import *


class Ui_MainWindow(object):
    def setupUi(self, MainWindow):
        if MainWindow.objectName():
            MainWindow.setObjectName(u"MainWindow")
        MainWindow.resize(1200, 800)
        MainWindow.setMinimumSize(QSize(1200, 800))
        MainWindow.setMaximumSize(QSize(1200, 800))
        font = QFont()
        font.setPointSize(8)
        MainWindow.setFont(font)
        self.centralwidget = QWidget(MainWindow)
        self.centralwidget.setObjectName(u"centralwidget")
        self.verticalLayout = QVBoxLayout(self.centralwidget)
        self.verticalLayout.setSpacing(0)
        self.verticalLayout.setObjectName(u"verticalLayout")
        self.verticalLayout.setContentsMargins(10, 10, 10, 10)
        self.drop_shadow_frame = QFrame(self.centralwidget)
        self.drop_shadow_frame.setObjectName(u"drop_shadow_frame")
        self.drop_shadow_frame.setEnabled(True)
        font1 = QFont()
        font1.setPointSize(2)
        font1.setBold(False)
        font1.setWeight(50)
        self.drop_shadow_frame.setFont(font1)
        self.drop_shadow_frame.setStyleSheet(u"background-color:qlineargradient(spread:pad, x1:0, y1:0, x2:1, y2:1, stop:0 rgba(13, 13, 13, 255), stop:0.972851 rgba(103, 103, 103, 255));\n"
"border-radius: 10px\n"
"")
        self.drop_shadow_frame.setFrameShape(QFrame.NoFrame)
        self.drop_shadow_frame.setFrameShadow(QFrame.Raised)
        self.lateral_bar = QFrame(self.drop_shadow_frame)
        self.lateral_bar.setObjectName(u"lateral_bar")
        self.lateral_bar.setGeometry(QRect(0, 0, 90, 781))
        self.lateral_bar.setMinimumSize(QSize(90, 781))
        self.lateral_bar.setMaximumSize(QSize(90, 781))
        self.lateral_bar.setStyleSheet(u"background-color:rgb(20, 20, 20);\n"
"background-color:#000000")
        self.lateral_bar.setFrameShape(QFrame.NoFrame)
        self.lateral_bar.setFrameShadow(QFrame.Raised)
        self.verticalLayout_2 = QVBoxLayout(self.lateral_bar)
        self.verticalLayout_2.setSpacing(0)
        self.verticalLayout_2.setObjectName(u"verticalLayout_2")
        self.verticalLayout_2.setContentsMargins(0, 0, 0, 0)
        self.fonctions = QFrame(self.lateral_bar)
        self.fonctions.setObjectName(u"fonctions")
        self.fonctions.setMinimumSize(QSize(90, 691))
        self.fonctions.setMaximumSize(QSize(90, 691))
        self.fonctions.setFrameShape(QFrame.StyledPanel)
        self.fonctions.setFrameShadow(QFrame.Raised)
        self.verticalLayout_4 = QVBoxLayout(self.fonctions)
        self.verticalLayout_4.setObjectName(u"verticalLayout_4")
        self.Raffles = QFrame(self.fonctions)
        self.Raffles.setObjectName(u"Raffles")
        self.Raffles.setFrameShape(QFrame.StyledPanel)
        self.Raffles.setFrameShadow(QFrame.Raised)
        self.btn_raffles = QPushButton(self.Raffles)
        self.btn_raffles.setObjectName(u"btn_raffles")
        self.btn_raffles.setGeometry(QRect(0, 0, 70, 163))
        self.btn_raffles.setMinimumSize(QSize(0, 0))
        self.btn_raffles.setMaximumSize(QSize(1000, 8000))
        font2 = QFont()
        font2.setFamily(u"MS Sans Serif")
        font2.setPointSize(1)
        self.btn_raffles.setFont(font2)
        self.btn_raffles.setLayoutDirection(Qt.LeftToRight)
        self.btn_raffles.setStyleSheet(u"QPushButton {\n"
"   border-radius:8px;\n"
"   background-color:none;\n"
"   border:2px solid rgb(45, 45, 45);\n"
"   \n"
"}\n"
"\n"
"QPushButton:hover {\n"
"   background-color:rgb(20, 20, 20);\n"
"   border:2px solid rgb(255, 255, 255)\n"
"}\n"
"")
        self.btn_raffles.setIconSize(QSize(64, 64))

        self.verticalLayout_4.addWidget(self.Raffles)


        self.verticalLayout_2.addWidget(self.fonctions)


        self.verticalLayout.addWidget(self.drop_shadow_frame)

        MainWindow.setCentralWidget(self.centralwidget)

        self.retranslateUi(MainWindow)

        QMetaObject.connectSlotsByName(MainWindow)
    # setupUi

    def retranslateUi(self, MainWindow):
        MainWindow.setWindowTitle(QCoreApplication.translate("MainWindow", u"MainWindow", None))
        self.btn_raffles.setText("")
    # retranslateUi

用于显示应用程序的代码如下:

from PySide2 import QtCore
from PySide2.QtCore import (QTime, Qt)
from PySide2.QtGui import (QPixmap)
from PySide2.QtWidgets import *
from PyQt5.QtCore import QThreadPool, QRunnable, pyqtSlot, pyqtSignal, QTimer
import sys
import PyQt5
from ui_main_mre import Ui_MainWindow



class MainWindow(QMainWindow):
    def __init__(self):
        QMainWindow.__init__(self)
        self.ui = Ui_MainWindow()
        self.ui.setupUi(self)



app = QApplication(sys.argv)
window = MainWindow()
window.show()
sys.exit(app.exec_())

主要问题是您将按钮添加到小部件(QFrames)并且没有在那里设置任何布局。使用固定的几何形状几乎从来都不是一个好主意,而在具有其他布局管理器的 UI 中这样做几乎总是一个非常糟糕的主意。
请记住,您在屏幕上看到的几乎绝不会其他人在他们屏幕上看到的;此外,Designer 并不总是在其预览中显示实际结果。在您的具体情况下,问题是当您的代码加载 ui 时,按钮实际上有点移动,因此由于它们的 parent 大小(child,它们的内容被部分隐藏小部件无法在 parent 的矩形之外绘制。

因此,首先,如果您的问题是确保按钮占据整个空间,请为所有包含按钮的 QFrames(以及任何其他仍然没有布局的小部件)设置布局 space 可用于其容器,然后将其水平和最重要的垂直大小策略设置为 Preferred(默认情况下 Qt 按钮不会垂直扩展)。

那么,您的实施还有其他问题:

  • 中央小部件内的主要小部件是“浮动的”(也称为固定几何形状),因此也为中央小部件设置布局;
  • 删除按钮的所有尺寸限制,因为它们是不必要的;
  • 避免通用样式表,尤其是在 parents 上设置时;使用 selectors 总是更好,否则您可能会遇到意外行为(尤其是来自 advanced/custom 小部件);
  • 检查 minimum/maximum 尺寸是否一致(按钮图标的最小尺寸大于最大尺寸);
  • 请注意,Qt 根据当前 OS 和使用的样式使用默认布局边距和间距,因此您必须小心这些方面很重要的特殊小部件(标题栏,在您的例子);如有疑问,明确 在布局属性中设置这些值(即使您可以将这些值设置为默认值)并记住 Designer 中的每个表单都可以具有布局的默认值“窗体 > 窗体设置”对话框(它们在设计器中没有可视化应用,但从代码加载时会受到尊重);