【问题标题】:Widgets getting cut off in PyQt5 on other system [duplicate]小部件在其他系统上的 PyQt5 中被切断 [重复]
【发布时间】:2020-12-10 10:36:04
【问题描述】:

我目前正在开发一个程序来计算我工作中的报价。在我的计算机上,我测试我的应用程序没有任何问题,而且一切都运行得很顺利。然而,一旦我在不同的系统上运行它,所有的小部件都会被切断并挤在一起。我目前没有问题的截图,但是

是窗口应该看起来的样子(在我的系统上也是如此)。我已在下面粘贴了该窗口的代码,我将尝试获取即将发生的情况的屏幕截图。

class BatteryWindow(QtWidgets.QMainWindow):
    def __init__(self):
        super(BatteryWindow, self).__init__()

        self.central_widget = QtWidgets.QWidget()
        self.central_layout = QtWidgets.QGridLayout(self.central_widget)

        self.middle_section = QtWidgets.QWidget(self.central_widget)
        self.middle_layout = QtWidgets.QGridLayout(self.middle_section)

        self.window_layout = QtWidgets.QGridLayout()

        font = QtGui.QFont()
        font.setPointSize(28)
        self.battery_quote_label = QtWidgets.QLabel(self.central_widget)
        self.battery_quote_label.setFont(font)
        self.window_layout.addWidget(self.battery_quote_label, 0, 0, 1, 1)

        font = QtGui.QFont()
        font.setPointSize(16)
        self.price_label = QtWidgets.QLabel(self.middle_section)
        self.price_label.setFont(font)
        self.middle_layout.addWidget(self.price_label, 0, 0, 1, 1)

        self.price_entry = QtWidgets.QLineEdit(self.middle_section)
        self.price_entry.setMaximumSize(QtCore.QSize(80, 31))
        self.price_entry.setFont(font)
        self.price_entry.setAlignment(QtCore.Qt.AlignCenter)
        self.middle_layout.addWidget(self.price_entry, 0, 1, 1, 1)

        self.num_batteries_label = QtWidgets.QLabel(self.middle_section)
        self.num_batteries_label.setFont(font)
        self.middle_layout.addWidget(self.num_batteries_label, 0, 6, 1, 1)

        self.num_batteries_select = QtWidgets.QSpinBox(self.middle_section)
        self.num_batteries_select.setFont(font)
        self.num_batteries_select.setMinimum(3)
        self.num_batteries_select.setMaximum(6)
        self.middle_layout.addWidget(self.num_batteries_select, 0, 7, 1, 1)

        self.battery_widget_1 = QtWidgets.QWidget(self.middle_section)
        self.battery_layout_1 = QtWidgets.QVBoxLayout(self.battery_widget_1)
        self.battery_layout_1.setContentsMargins(3, 3, 3, 3)
        self.battery_layout_1.setSpacing(20)

        self.total_1 = QtWidgets.QLabel(self.battery_widget_1)
        self.total_1.setMinimumSize(QtCore.QSize(186, 25))
        self.total_1.setFont(font)
        self.battery_layout_1.addWidget(self.total_1)

        self.info_widget_1 = QtWidgets.QWidget(self.battery_widget_1)
        self.info_layout_1 = QtWidgets.QVBoxLayout(self.info_widget_1)
        self.info_layout_1.setContentsMargins(0, 0, 0, 0)

        self.core_fee_1 = QtWidgets.QLabel(self.info_widget_1)
        self.core_fee_1.setMinimumSize(QtCore.QSize(186, 25))
        self.core_fee_1.setFont(font)
        self.info_layout_1.addWidget(self.core_fee_1)

        self.tax_1 = QtWidgets.QLabel(self.info_widget_1)
        self.tax_1.setMinimumSize(QtCore.QSize(186, 25))
        self.tax_1.setFont(font)
        self.info_layout_1.addWidget(self.tax_1)

        self.battery_layout_1.addWidget(self.info_widget_1)
        self.middle_layout.addWidget(self.battery_widget_1, 1, 0, 1, 3)

        self.line_1 = QtWidgets.QFrame(self.middle_section)
        self.line_1.setFrameShape(QtWidgets.QFrame.VLine)
        self.line_1.setFrameShadow(QtWidgets.QFrame.Sunken)
        self.middle_layout.addWidget(self.line_1, 1, 3, 1, 1)

        self.battery_widget_2 = QtWidgets.QWidget(self.middle_section)
        self.battery_layout_2 = QtWidgets.QVBoxLayout(self.battery_widget_2)
        self.battery_layout_2.setContentsMargins(3, 3, 3, 3)
        self.battery_layout_2.setSpacing(20)

        self.total_2 = QtWidgets.QLabel(self.battery_widget_2)
        self.total_2.setMinimumSize(QtCore.QSize(186, 25))
        self.total_2.setFont(font)
        self.battery_layout_2.addWidget(self.total_2)

        self.info_widget_2 = QtWidgets.QWidget(self.battery_widget_2)
        self.info_layout_2 = QtWidgets.QVBoxLayout(self.info_widget_2)
        self.info_layout_2.setContentsMargins(0, 0, 0, 0)

        self.core_fee_2 = QtWidgets.QLabel(self.info_widget_2)
        self.core_fee_2.setMinimumSize(QtCore.QSize(186, 25))
        self.core_fee_2.setFont(font)
        self.info_layout_2.addWidget(self.core_fee_2)

        self.tax_2 = QtWidgets.QLabel(self.info_widget_2)
        self.tax_2.setMinimumSize(QtCore.QSize(186, 25))
        self.tax_2.setFont(font)
        self.info_layout_2.addWidget(self.tax_2)

        self.battery_layout_2.addWidget(self.info_widget_2)
        self.middle_layout.addWidget(self.battery_widget_2, 1, 4, 1, 1)

        self.line_2 = QtWidgets.QFrame(self.middle_section)
        self.line_2.setFrameShape(QtWidgets.QFrame.VLine)
        self.line_2.setFrameShadow(QtWidgets.QFrame.Sunken)
        self.middle_layout.addWidget(self.line_2, 1, 5, 1, 1)

        self.battery_widget_3 = QtWidgets.QWidget(self.middle_section)
        self.battery_layout_3 = QtWidgets.QVBoxLayout(self.battery_widget_3)
        self.battery_layout_3.setContentsMargins(3, 3, 3, 3)
        self.battery_layout_3.setSpacing(20)

        self.total_3 = QtWidgets.QLabel(self.battery_widget_3)
        self.total_3.setMinimumSize(QtCore.QSize(186, 25))
        self.total_3.setFont(font)
        self.battery_layout_3.addWidget(self.total_3)

        self.info_widget_3 = QtWidgets.QWidget(self.battery_widget_3)
        self.info_layout_3 = QtWidgets.QVBoxLayout(self.info_widget_3)
        self.info_layout_3.setContentsMargins(0, 0, 0, 0)

        self.core_fee_3 = QtWidgets.QLabel(self.info_widget_3)
        self.core_fee_3.setMinimumSize(QtCore.QSize(186, 25))
        self.core_fee_3.setFont(font)
        self.info_layout_3.addWidget(self.core_fee_3)

        self.tax_3 = QtWidgets.QLabel(self.info_widget_3)
        self.tax_3.setMinimumSize(QtCore.QSize(186, 25))
        self.tax_3.setFont(font)
        self.info_layout_3.addWidget(self.tax_3)

        self.battery_layout_3.addWidget(self.info_widget_3)
        self.middle_layout.addWidget(self.battery_widget_3, 1, 6, 1, 2)

        self.middle_layout.setColumnStretch(2, 1)
        self.middle_layout.setColumnStretch(4, 1)
        self.middle_layout.setColumnStretch(6, 1)
        self.middle_layout.setRowStretch(1, 1)
        self.window_layout.addWidget(self.middle_section, 1, 0, 1, 2)

        font = QtGui.QFont()
        font.setPointSize(14)
        self.core_fee_check = QtWidgets.QCheckBox(self.central_widget)
        self.core_fee_check.setFont(font)
        self.core_fee_check.setChecked(True)
        self.window_layout.addWidget(self.core_fee_check, 2, 0, 1, 1)

        self.calculate_button = QtWidgets.QPushButton(self.central_widget)
        self.calculate_button.setMinimumSize(QtCore.QSize(111, 31))
        self.calculate_button.setMaximumSize(QtCore.QSize(111, 35))
        self.calculate_button.setFont(font)
        self.calculate_button.clicked.connect(self.calculate_price)
        self.window_layout.addWidget(self.calculate_button, 2, 1, 1, 1)

        self.window_layout.setRowStretch(1, 1)
        self.central_layout.addLayout(self.window_layout, 0, 0, 1, 1)

        self.menubar = MenuBar(self)

        self.setCentralWidget(self.central_widget)

        self.retranslate_ui(self)

        self.price_entry.returnPressed.connect(self.calculate_price)

        self.setMinimumSize(QtCore.QSize())
        self.setMaximumSize(QtCore.QSize())

        QtCore.QMetaObject.connectSlotsByName(self)

    def retranslate_ui(self, main_window):
        main_window.setWindowTitle("Quote Calculator")

        self.battery_quote_label.setText("Batteries")

        self.price_label.setText("Price:")
        self.num_batteries_label.setText("# of batteries:")

        self.total_1.setText("1 Battery: 0.00")
        self.core_fee_1.setText("Core Fee: 0.00")
        self.tax_1.setText("Tax: 0.00")

        self.total_2.setText("2 Batteries: 0.00")
        self.core_fee_2.setText("Core Fee: 0.00")
        self.tax_2.setText("Tax: 0.00")

        self.total_3.setText("3 Batteries: 0.00")
        self.core_fee_3.setText("Core Fee: 0.00")
        self.tax_3.setText("Tax: 0.00")

        self.core_fee_check.setText("Core Fee")
        self.calculate_button.setText("Calculate")

    def calculate_price(self):
        try:
            price = float(self.price_entry.text())
        except ValueError:
            return
        battery_amount = int(self.num_batteries_select.text())
        core_fee = 15 if self.core_fee_check.isChecked() else 0
        tax_rate = get_tax_rate('roseville ca')
        tax = (price + core_fee) * tax_rate
        subtotal = price + core_fee
        total = subtotal + tax

        self.total_1.setText("1 Battery: {:.2f}".format(total))
        self.total_2.setText("2 Batteries: {:.2f}".format(total*2))
        self.total_3.setText("{} Batteries: {:.2f}".format(battery_amount, total*battery_amount))

        self.core_fee_1.setText("Core Fee: {:.2f}".format(core_fee))
        self.core_fee_2.setText("Core Fee: {:.2f}".format(core_fee*2))
        self.core_fee_3.setText("Core Fee: {:.2f}".format(core_fee*battery_amount))

        self.tax_1.setText("Tax: {:.2f}".format(tax))
        self.tax_2.setText("Tax: {:.2f}".format(tax*2))
        self.tax_3.setText("Tax: {:.2f}".format(tax*battery_amount))


if __name__ == "__main__":
    import sys
    app = QtWidgets.QApplication(sys.argv)
    ui = BatteryWindow()
    ui.show()
    sys.exit(app.exec_())

【问题讨论】:

  • 我还应该补充一点,我正在使用 pyinstaller 在其他系统上测试我的应用程序。由于测试依赖关系,我没有在另一个系统上运行源代码。

标签: python pyqt5 pyinstaller


【解决方案1】:

添加这段代码

    if hasattr(QtCore.Qt, 'AA_EnableHighDpiScaling'):
        PyQt5.QtWidgets.QApplication.setAttribute(QtCore.Qt.AA_EnableHighDpiScaling, True)

    if hasattr(QtCore.Qt, 'AA_UseHighDpiPixmaps'):
        PyQt5.QtWidgets.QApplication.setAttribute(QtCore.Qt.AA_UseHighDpiPixmaps, True)

if __name__ == "__main__":里面 如果您的小部件被切断并挤压在一起,则部分。

【讨论】:

  • if __name__ == "__main__": 仅用于测试每个单独的窗口。我可以将它添加到我班级的__init__ 方法中吗?
猜你喜欢
  • 1970-01-01
  • 2018-11-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-12-27
  • 2016-02-18
  • 2020-06-08
  • 2011-02-04
相关资源
最近更新 更多