与 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 中的每个表单都可以具有布局的默认值“窗体 > 窗体设置”对话框(它们在设计器中没有可视化应用,但从代码加载时会受到尊重);
我正在使用 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 中的每个表单都可以具有布局的默认值“窗体 > 窗体设置”对话框(它们在设计器中没有可视化应用,但从代码加载时会受到尊重);