Darstellung/Scalierung Windows 10 vs Windows 11

Python und das Qt-Toolkit, erstellen von GUIs mittels des Qt-Designers.
GMAch
User
Beiträge: 47
Registriert: Dienstag 4. September 2018, 07:32

Hi,

ich hab für ein Programm eine PYQT5 GUI unter Windows 10 mit dem QT Designer erstellt.

Wenn ich das Programm mit Windows 10 ausführe sieht es auch so aus wie es soll, aber unter Windows 11 ist die Schrift auf den Button auf einmal deutlich größer, und ragt über die Breite des Button selbst hinaus.
Nutzt Windows 11 einen anderen Font?

Was ist die Ursache und wie fix ich das?

Die Abstände und Größe der Elemente in der GUI scheinen auch fix zu sein und nicht mit der Fenstergröße zu Skalieren, was müsste ich im Designer tun um diesen Effekt zu erreichen?
Benutzeravatar
snafu
User
Beiträge: 6850
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Schwer zu sagen, ohne deinen Code zu kennen. Wir ordnest du deine Widgets an? Benutzt du dafür einen Layout Manager?

Das hier klingt für mich als würdest du bisher einfach die Widgets händisch im Designer platzieren, ohne Manager:
GMAch hat geschrieben: Dienstag 27. Mai 2025, 08:04 Die Abstände und Größe der Elemente in der GUI scheinen auch fix zu sein und nicht mit der Fenstergröße zu Skalieren
GMAch
User
Beiträge: 47
Registriert: Dienstag 4. September 2018, 07:32

snafu hat geschrieben: Dienstag 27. Mai 2025, 10:21 Schwer zu sagen, ohne deinen Code zu kennen. Wir ordnest du deine Widgets an? Benutzt du dafür einen Layout Manager?
Ich benutz Horinzontale und Vertikale Layout gepackt.

Ich hab in der Regel eine Minumum Size eingegeben und die Font Größe der Buttons etwas erhöht aber sonst die Default einstellungen in Bezug auf die Size Policy so gelassen wie sie war.

Jetzt hab ich das Problem das die Beschrifftung der Buttons in Windows 11 plötzlich größer ist als die Buttons.
Benutzeravatar
__blackjack__
User
Beiträge: 13997
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@GMAch: Und wenn Du die MinimumSize raus nimmst? Denn wenn die kleiner ist als der Platz den der Inhalt braucht, hast Du genau dieses Problem.
“The best book on programming for the layman is »Alice in Wonderland«; but that's because it's the best book on anything for the layman.” — Alan J. Perlis
GMAch
User
Beiträge: 47
Registriert: Dienstag 4. September 2018, 07:32

Hi ich hab jetzt zumindest raus gefunden was das Problem Verursacht, es liegt nicht an der Windows Version sondern an der Anzeigen EInstellung.

Bei dem Windows 10 PC ist die Skalierung auf 100% gesetzt bei dem Windows 11 PC auf Grund des größeren Monitors auf 150%.

Wenn ich die Anzeigen Einstellung in WIndows 10 änder habe ich das selbe Problem. Es wirkt auf mich als würde die Texte (sowohl auf der Buttons als auch in QLabels) in der GUI Skalieren aber die Größe der Elemente (Sprich Buttons und Label) Nicht.
@GMAch: Und wenn Du die MinimumSize raus nimmst? Denn wenn die kleiner ist als der Platz den der Inhalt braucht, hast Du genau dieses Problem.
Naja ich hätte halt gerne das die Buttons aus ästhetischen Gründen Gleich Groß sind, und das Schien mir der Einfachste Weg das zu erreichen.
Benutzeravatar
snafu
User
Beiträge: 6850
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Hier hatte jemand ein ähnliches Problem nach einem Windows-Update, wobei bei ihm die Fonts wohl kleiner wurden:
https://forum.qt.io/topic/140909/fonts- ... ows-update

Vielleicht kannst du damit etwas anfangen?
Benutzeravatar
__blackjack__
User
Beiträge: 13997
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@GMAch: Einfach ist halt manchmal falsch. Gleich gross sind die doch schon automatisch wenn man die in einem Layout anordnet‽
“The best book on programming for the layman is »Alice in Wonderland«; but that's because it's the best book on anything for the layman.” — Alan J. Perlis
GMAch
User
Beiträge: 47
Registriert: Dienstag 4. September 2018, 07:32

__blackjack__ hat geschrieben: Dienstag 27. Mai 2025, 13:25 @GMAch: Einfach ist halt manchmal falsch. Gleich gross sind die doch schon automatisch wenn man die in einem Layout anordnet‽
Nicht in einem Horizontalen Layout, jedenfalls nicht bei mir.

Nach erwas Googlen hab ich jetzt erstmal noch die Zeile

Code: Alles auswählen

QApplication.setAttribute(QtCore.Qt.AA_EnableHighDpiScaling, True)
In den Code gepackt, damit sehen Bildschirm Scalen von 150% und 175%, aber 125% hat immer noch das selbe Problem.
Benutzeravatar
Dennis89
User
Beiträge: 1516
Registriert: Freitag 11. Dezember 2020, 15:13

Hallo,

nur um das nachzuvollziehen, meinst du in dem Fall mit "gleich Groß" die Länge der Buttons und nicht die Höhe?
Ich nutze bei so Sachen eine Kombination aus horizontalen und vertikalen Layouts oder Grid Layout.

Grüße
Dennis
"When I got the music, I got a place to go" [Rancid, 1993]
GMAch
User
Beiträge: 47
Registriert: Dienstag 4. September 2018, 07:32

Dennis89 hat geschrieben: Dienstag 27. Mai 2025, 19:28 nur um das nachzuvollziehen, meinst du in dem Fall mit "gleich Groß" die Länge der Buttons und nicht die Höhe?
Ich nutze bei so Sachen eine Kombination aus horizontalen und vertikalen Layouts oder Grid Layout.
Wenn du die Sache mit den Layout und der Buttongröße Meinst.

Ja, da ich auf allen Button die Selbe Schrift Größe habe sind sie automatisch gleich hoch, allerdings sind die Texte nicht gleich lang, und wenn ich einfach im Ot Designer ein horizontales Layout oder ein einzeiliges Grid darauf anwende ändert sich die länge der Buttons, ich hab außer der Mindestlänge keine Möglichkeit gefunden das zu vermeiden.

Zum wenn es um das eigendliche Problem geht hier sind mal zwei Bilder die ein Beispiel bei 100% und 125% zeigen.

Bild

Bild

Hier noch mal Links zu den Bildern in voller Größe.
100%
125%
Benutzeravatar
__blackjack__
User
Beiträge: 13997
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

Okay, dann Mindestlänge, aber nicht fest angeben, sondern schauen wie gross beziehungsweise breit der breiteste Button ist:

Code: Alles auswählen

#!/usr/bin/env python3
import sys

from PyQt5.QtWidgets import QApplication, QHBoxLayout, QPushButton, QWidget


def main():
    app = QApplication(sys.argv)
    window = QWidget()

    layout = QHBoxLayout()

    buttons = []
    for text in ["1", "Zwei", "Zweiundvierzig", "Viertausensiebenhundertelf"]:
        button = QPushButton(text)
        layout.addWidget(button)
        buttons.append(button)

    width = max(button.sizeHint().width() for button in buttons)
    for button in buttons:
        button.setMinimumWidth(width)

    window.setLayout(layout)
    window.show()
    sys.exit(app.exec())


if __name__ == "__main__":
    main()
“The best book on programming for the layman is »Alice in Wonderland«; but that's because it's the best book on anything for the layman.” — Alan J. Perlis
Benutzeravatar
snafu
User
Beiträge: 6850
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

__blackjack__ hat geschrieben: Dienstag 27. Mai 2025, 12:41 Denn wenn die kleiner ist als der Platz den der Inhalt braucht, hast Du genau dieses Problem.
Also bei mir vergrößern sich die Buttons bei langen Texten weiterhin. Auch wenn die Mindestgröße zu klein gesetzt wird. Wäre ja auch komisch, weil dann der Name nicht zum Verhalten passen würde.

Code: Alles auswählen

#!/usr/bin/env python3
import sys

from PyQt5.QtWidgets import QApplication, QHBoxLayout, QPushButton, QWidget

def set_button_width(buttons, scale=1):
    width = max(button.sizeHint().width() for button in buttons)
    if scale != 1:
        width = int(width * scale)
    for button in buttons:
        button.setMinimumWidth(width)

def main():
    app = QApplication(sys.argv)
    window = QWidget()

    layout = QHBoxLayout()

    buttons = []
    for text in ["1", "Zwei", "Zweiundvierzig", "Viertausensiebenhundertelf"]:
        button = QPushButton(text)
        layout.addWidget(button)
        buttons.append(button)

    set_button_width(buttons, 0.5)

    window.setLayout(layout)
    window.show()
    sys.exit(app.exec())


if __name__ == "__main__":
    main()
Benutzeravatar
__blackjack__
User
Beiträge: 13997
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@snafu: Ja klar vergrössern die sich, aber das Problem ist ja dass man sie *kleiner* machen kann als den Inhalt. Genau das Problem hat Dein Code ja jetzt auch. a) sind die initial jetzt wieder nicht gleich gross, und b) kann man das Fenster verkleinern so dass die Texte nicht mehr rein passen.

So sieht's bei Deinem Code direkt nach dem Start aus (oben) und ich kann das Fenster dann zu weit verkleinern (unten):
Bild
Beides sollte nicht so sein.
“The best book on programming for the layman is »Alice in Wonderland«; but that's because it's the best book on anything for the layman.” — Alan J. Perlis
GMAch
User
Beiträge: 47
Registriert: Dienstag 4. September 2018, 07:32

Ich scheine in meiner GUI irgendein Setting gemacht zu haben das das stretchen verhindert.

Wenn ich die Fenstergröße änder bewegen sich weder die Größe der Widgets noch ändert ich ihre Position, wenn ich das Beispiel von _blackjack_ ausführe ändern sich die Größen hingegen wenn ich die Fenstergröße änder, bin mir nicht ganz sicher wo der Unzterschied liegt.

Weiß nicht ob es hilft aber der Output vom Qt Designer nach der Umwandlung mit pyuic5 siegt so aus:

Code: Alles auswählen

from PyQt5 import QtCore, QtGui, QtWidgets

class Ui_TEST_Dialog(object):
    def setupUi(self, TEST_Dialog):
        TEST_Dialog.setObjectName("TEST_Dialog")
        TEST_Dialog.resize(750, 245)
        font = QtGui.QFont()
        font.setBold(False)
        font.setWeight(50)
        TEST_Dialog.setFont(font)
        self.layoutWidget = QtWidgets.QWidget(TEST_Dialog)
        self.layoutWidget.setGeometry(QtCore.QRect(10, 10, 732, 225))
        self.layoutWidget.setObjectName("layoutWidget")
        self.verticalLayout = QtWidgets.QVBoxLayout(self.layoutWidget)
        self.verticalLayout.setContentsMargins(0, 0, 0, 0)
        self.verticalLayout.setObjectName("verticalLayout")
        self.horizontalLayout = QtWidgets.QHBoxLayout()
        self.horizontalLayout.setObjectName("horizontalLayout")
        spacerItem = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum)
        self.horizontalLayout.addItem(spacerItem)
        self.gridLayout = QtWidgets.QGridLayout()
        self.gridLayout.setObjectName("gridLayout")
        self.COM_label = QtWidgets.QLabel(self.layoutWidget)
        font = QtGui.QFont()
        font.setBold(False)
        font.setWeight(50)
        self.COM_label.setFont(font)
        self.COM_label.setObjectName("COM_label")
        self.gridLayout.addWidget(self.COM_label, 0, 0, 1, 1)
        self.COM_spinBox = QtWidgets.QSpinBox(self.layoutWidget)
        self.COM_spinBox.setMinimum(1)
        self.COM_spinBox.setMaximum(256)
        self.COM_spinBox.setObjectName("COM_spinBox")
        self.gridLayout.addWidget(self.COM_spinBox, 0, 1, 1, 1)
        self.COM_QR_label = QtWidgets.QLabel(self.layoutWidget)
        font = QtGui.QFont()
        font.setBold(False)
        font.setWeight(50)
        self.COM_QR_label.setFont(font)
        self.COM_QR_label.setObjectName("COM_QR_label")
        self.gridLayout.addWidget(self.COM_QR_label, 1, 0, 1, 1)
        self.COM_QR_spinBox = QtWidgets.QSpinBox(self.layoutWidget)
        self.COM_QR_spinBox.setMinimum(1)
        self.COM_QR_spinBox.setMaximum(256)
        self.COM_QR_spinBox.setObjectName("COM_QR_spinBox")
        self.gridLayout.addWidget(self.COM_QR_spinBox, 1, 1, 1, 1)
        self.horizontalLayout.addLayout(self.gridLayout)
        self.verticalLayout.addLayout(self.horizontalLayout)
        spacerItem1 = QtWidgets.QSpacerItem(20, 13, QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Expanding)
        self.verticalLayout.addItem(spacerItem1)
        self.Message_label = QtWidgets.QLabel(self.layoutWidget)
        self.Message_label.setMinimumSize(QtCore.QSize(730, 120))
        font = QtGui.QFont()
        font.setPointSize(12)
        self.Message_label.setFont(font)
        self.Message_label.setFrameShape(QtWidgets.QFrame.WinPanel)
        self.Message_label.setFrameShadow(QtWidgets.QFrame.Sunken)
        self.Message_label.setText("")
        self.Message_label.setAlignment(QtCore.Qt.AlignCenter)
        self.Message_label.setWordWrap(True)
        self.Message_label.setObjectName("Message_label")
        self.verticalLayout.addWidget(self.Message_label)
        spacerItem2 = QtWidgets.QSpacerItem(20, 13, QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Expanding)
        self.verticalLayout.addItem(spacerItem2)
        self.horizontalLayout_2 = QtWidgets.QHBoxLayout()
        self.horizontalLayout_2.setObjectName("horizontalLayout_2")
        self.Firmware_pushButton = QtWidgets.QPushButton(self.layoutWidget)
        self.Firmware_pushButton.setMinimumSize(QtCore.QSize(130, 0))
        font = QtGui.QFont()
        font.setPointSize(12)
        font.setBold(False)
        font.setWeight(50)
        self.Firmware_pushButton.setFont(font)
        self.Firmware_pushButton.setObjectName("Firmware_pushButton")
        self.horizontalLayout_2.addWidget(self.Firmware_pushButton)
        spacerItem3 = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum)
        self.horizontalLayout_2.addItem(spacerItem3)
        self.Test_pushButton = QtWidgets.QPushButton(self.layoutWidget)
        self.Test_pushButton.setMinimumSize(QtCore.QSize(130, 0))
        font = QtGui.QFont()
        font.setPointSize(12)
        font.setBold(False)
        font.setWeight(50)
        self.Test_pushButton.setFont(font)
        self.Test_pushButton.setObjectName("Test_pushButton")
        self.horizontalLayout_2.addWidget(self.Test_pushButton)
        spacerItem4 = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum)
        self.horizontalLayout_2.addItem(spacerItem4)
        self.SN_pushButton = QtWidgets.QPushButton(self.layoutWidget)
        self.SN_pushButton.setMinimumSize(QtCore.QSize(130, 0))
        font = QtGui.QFont()
        font.setPointSize(12)
        font.setBold(False)
        font.setWeight(50)
        self.SN_pushButton.setFont(font)
        self.SN_pushButton.setObjectName("SN_pushButton")
        self.horizontalLayout_2.addWidget(self.SN_pushButton)
        spacerItem5 = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum)
        self.horizontalLayout_2.addItem(spacerItem5)
        self.QR_pushButton = QtWidgets.QPushButton(self.layoutWidget)
        self.QR_pushButton.setMinimumSize(QtCore.QSize(130, 0))
        font = QtGui.QFont()
        font.setPointSize(12)
        self.QR_pushButton.setFont(font)
        self.QR_pushButton.setObjectName("QR_pushButton")
        self.horizontalLayout_2.addWidget(self.QR_pushButton)
        spacerItem6 = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum)
        self.horizontalLayout_2.addItem(spacerItem6)
        self.Port_pushButton = QtWidgets.QPushButton(self.layoutWidget)
        self.Port_pushButton.setMinimumSize(QtCore.QSize(130, 0))
        font = QtGui.QFont()
        font.setPointSize(12)
        self.Port_pushButton.setFont(font)
        self.Port_pushButton.setObjectName("Port_pushButton")
        self.horizontalLayout_2.addWidget(self.Port_pushButton)
        self.verticalLayout.addLayout(self.horizontalLayout_2)
        self.COM_label.setBuddy(self.COM_spinBox)
        self.COM_QR_label.setBuddy(self.COM_QR_spinBox)

        self.retranslateUi(TEST_Dialog)
        QtCore.QMetaObject.connectSlotsByName(TEST_Dialog)

    def retranslateUi(self, TEST_Dialog):
        _translate = QtCore.QCoreApplication.translate
        TEST_Dialog.setWindowTitle(_translate("TEST_Dialog", "Production Test"))
        self.COM_label.setText(_translate("TEST_Dialog", "COM-Port Test Adapter"))
        self.COM_QR_label.setText(_translate("TEST_Dialog", "COM-Port Label Printer"))
        self.Firmware_pushButton.setText(_translate("TEST_Dialog", "Firmware Upload"))
        self.Test_pushButton.setText(_translate("TEST_Dialog", "Start Test"))
        self.SN_pushButton.setText(_translate("TEST_Dialog", "Set SN Manually"))
        self.QR_pushButton.setText(_translate("TEST_Dialog", "Print Label"))
        self.Port_pushButton.setText(_translate("TEST_Dialog", "Scan Ports"))

Zuletzt geändert von GMAch am Mittwoch 28. Mai 2025, 14:36, insgesamt 1-mal geändert.
GMAch
User
Beiträge: 47
Registriert: Dienstag 4. September 2018, 07:32

Mein code zum Aufruf der GUI sieht vereinfacht wie folgt aus:

Code: Alles auswählen

import sys
import os
from PyQt5 import QtCore
from PyQt5.QtWidgets import QDialog, QMessageBox, QInputDialog, QApplication
from Button_Test import *
QApplication.setAttribute(QtCore.Qt.AA_EnableHighDpiScaling, True)


class Button_GUI(QDialog):
    def __init__(self):
        super().__init__()
        self.ui = Ui_TEST_Dialog
        self.ui.setupUi(self)
        self.show()
        
if __name__=="__main__":
    app = QApplication(sys.argv)
    w = Button_GUI()
    w.show()
    sys.exit(app.exec_())
Benutzeravatar
__blackjack__
User
Beiträge: 13997
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@GMAch: Der Sternchen-Import sollte nicht sein. `os` wird importiert aber nirgends verwendet.

Die erste Zeile nach den Importen sollte in der Hauptfunktion stehen, wo auch der Rest vom Hauptprogramm stehen sollte.

Widgets zeigen sich nicht selbst an, also das ``self.show()`` sollte nicht sein. Ist ja auch gar nicht nötig, denn `w.show()` erledigt diesen Schritt ja. `w` ist zu kurz als Name.

`exec_()` ist veraltet und wird aus der API verschwinden (weiss gerade gar nicht ob es die Methode unter dem Namen in PyQt6 nicht schon nicht mehr gibt). Der Unterstrich war in Python 2 nötig, weil es dort ein ``exec``-Schlüsselwort gab, dass es in Python 3 nicht mehr gibt. Also nur `exec()`.

Quelltext aus *.ui-Dateien generieren macht man eigentlich nicht mehr. Man lädt die *.ui-Datei zur Laufzeit mit `PyQt5.uic.loadUi()`.

Im Designer gibt man dann den Buttons Namen und kann dann den Code dafür schreiben um die Mindestbreite auf den sizeHint des breitesten Buttons zu setzen.

Code: Alles auswählen

import sys
from pathlib import Path

from PyQt5 import QtCore
from PyQt5.QtWidgets import QApplication, QDialog
from PyQt5.uic import loadUi

UI_FILE_PATH = Path(__file__).parent / "test.ui"


class ButtonUi(QDialog):
    def __init__(self):
        super().__init__()
        loadUi(UI_FILE_PATH, self)
        buttons = [
            self.first_button,
            self.second_button,
            self.third_button,
            self.fourth_button,
        ]
        width = max(button.sizeHint().width() for button in buttons)
        for button in buttons:
            button.setMinimumWidth(width)


def main():
    QApplication.setAttribute(QtCore.Qt.AA_EnableHighDpiScaling, True)
    app = QApplication(sys.argv)
    window = ButtonUi()
    window.show()
    sys.exit(app.exec())


if __name__ == "__main__":
    main()
Falls man den Buttons keine einzelnen Namen geben möchte/muss, kann man auch dem Containerwidget wo die Buttons drin sind, einen Namen geben und dann von dort aus nach den Kindern suchen die den passenden Datentyp haben.
“The best book on programming for the layman is »Alice in Wonderland«; but that's because it's the best book on anything for the layman.” — Alan J. Perlis
GMAch
User
Beiträge: 47
Registriert: Dienstag 4. September 2018, 07:32

Hi,

ich hab das so aus einem Buch übernommen, das war dann wohl nicht mehr up to date.

Bin mir aber nicht sicher ob das mein eigentliches Problem löst, kann jetzt aber vor Montag auch nicht mehr groß rumprobieren.
Benutzeravatar
snafu
User
Beiträge: 6850
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Also ich hab jetzt mal etwas mit dem Designer gebastelt, was absichtlich größere Texte hat:
Bild

buttons.py:

Code: Alles auswählen

from functools import partial
from pathlib import Path
import sys

from PyQt5 import QtCore
from PyQt5.QtWidgets import QApplication, QMainWindow
from PyQt5.uic import loadUi

UI_FILE_PATH = Path(__file__).parent / "buttons.ui"


class ButtonUi(QMainWindow):
    def __init__(self):
        super().__init__()
        loadUi(UI_FILE_PATH, self)
        buttons = [
            self.short_text_button,
            self.longer_text_button,
            self.longest_text_button,
        ]
        button_width = max(
            button.sizeHint().width() for button in buttons
        )
        for button in buttons:
            button.setMinimumWidth(button_width)
            button.clicked.connect(partial(self.on_clicked, button))

    def on_clicked(self, button):
        self.selected_button_label.setText(f"'{button.text()}' was clicked")


def main():
    QApplication.setAttribute(QtCore.Qt.AA_EnableHighDpiScaling, True)
    app = QApplication(sys.argv)
    window = ButtonUi()
    window.show()
    sys.exit(app.exec())


if __name__ == "__main__":
    main()
buttons.ui:

Code: Alles auswählen

<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
 <class>MainWindow</class>
 <widget class="QMainWindow" name="MainWindow">
  <property name="geometry">
   <rect>
    <x>0</x>
    <y>0</y>
    <width>782</width>
    <height>155</height>
   </rect>
  </property>
  <property name="windowTitle">
   <string>MainWindow</string>
  </property>
  <widget class="QWidget" name="centralwidget">
   <layout class="QGridLayout" name="gridLayout">
    <property name="leftMargin">
     <number>15</number>
    </property>
    <property name="topMargin">
     <number>15</number>
    </property>
    <property name="rightMargin">
     <number>15</number>
    </property>
    <property name="bottomMargin">
     <number>15</number>
    </property>
    <item row="0" column="0" colspan="2">
     <widget class="QLabel" name="label_3">
      <property name="font">
       <font>
        <pointsize>12</pointsize>
        <italic>true</italic>
        <bold>true</bold>
       </font>
      </property>
      <property name="text">
       <string>Welcome to the BUTTON APP</string>
      </property>
     </widget>
    </item>
    <item row="1" column="3">
     <widget class="QPushButton" name="longest_text_button">
      <property name="font">
       <font>
        <pointsize>12</pointsize>
       </font>
      </property>
      <property name="text">
       <string>This is a very long text for a button</string>
      </property>
     </widget>
    </item>
    <item row="1" column="2">
     <widget class="QPushButton" name="longer_text_button">
      <property name="font">
       <font>
        <pointsize>12</pointsize>
       </font>
      </property>
      <property name="text">
       <string>A bit longer text</string>
      </property>
     </widget>
    </item>
    <item row="1" column="0">
     <widget class="QLabel" name="label">
      <property name="font">
       <font>
        <pointsize>12</pointsize>
       </font>
      </property>
      <property name="text">
       <string>Choose a button:</string>
      </property>
     </widget>
    </item>
    <item row="1" column="1">
     <widget class="QPushButton" name="short_text_button">
      <property name="font">
       <font>
        <pointsize>12</pointsize>
       </font>
      </property>
      <property name="text">
       <string>Short text</string>
      </property>
     </widget>
    </item>
    <item row="2" column="0">
     <widget class="QLabel" name="label_2">
      <property name="font">
       <font>
        <pointsize>12</pointsize>
       </font>
      </property>
      <property name="text">
       <string>Your selection:</string>
      </property>
     </widget>
    </item>
    <item row="2" column="1" colspan="3">
     <widget class="QLabel" name="selected_button_label">
      <property name="font">
       <font>
        <pointsize>12</pointsize>
       </font>
      </property>
      <property name="text">
       <string>(no text button clicked)</string>
      </property>
     </widget>
    </item>
   </layout>
  </widget>
  <action name="action_Exit">
   <property name="text">
    <string>&amp;Exit</string>
   </property>
  </action>
 </widget>
 <resources/>
 <connections/>
</ui>
Dafür habe ich stumpf ein GridLayout für das Fenster benutzt. Die Angaben für "row" und "column" übernimmt der Designer dann automatisch im XML. Der erkennt eigentlich ganz gut, was man wie positionieren möchte. Für den Text der Auswahl habe ich das Label in der Breite leicht über den letzten Button gezogen. Damit habe ich colspan=3 erreicht, andernfalls hätte längerer Text die Button-Breiten beeinflusst.

Jedenfalls verhält sich das beim Scrollen nun erwartungsgemäß. Da, wo die minimalen Breiten erreicht sind, blockiert er das weitere Verkleinern des Fensters. Vielleicht hilft es dir ja. :)
GMAch
User
Beiträge: 47
Registriert: Dienstag 4. September 2018, 07:32

Hi, ich hab noch mal rum gespielt es muss da im Qt Designer irgend eine Fundamentale Einstellung geben die bei mir das Stretchen unterbindet (oder ich mach irgendwas beim Erstellen Fundamental falsch).

Ich hab Snafus XML code in eine .ui Datei Kopiert und mit dann mit seinem Python Code ausgeführt, und er funktioniert wie er soll.

Dann hab ich die Datei im QtDesigner geföffnet, die Widgets per "Strg A"+"Strg C" in ein anderes "QMainWindow" kopiert, das abgespeichert und mit dem selben Skrip ausgeführt, und es Funktioniert auf einmal nicht mehr.

Hier ist das Resultat:

Code: Alles auswählen

<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
 <class>MainWindow</class>
 <widget class="QMainWindow" name="MainWindow">
  <property name="geometry">
   <rect>
    <x>0</x>
    <y>0</y>
    <width>783</width>
    <height>194</height>
   </rect>
  </property>
  <property name="windowTitle">
   <string>MainWindow</string>
  </property>
  <widget class="QWidget" name="centralwidget">
   <widget class="QPushButton" name="longer_text_button">
    <property name="geometry">
     <rect>
      <x>339</x>
      <y>60</y>
      <width>159</width>
      <height>27</height>
     </rect>
    </property>
    <property name="font">
     <font>
      <pointsize>12</pointsize>
     </font>
    </property>
    <property name="text">
     <string>A bit longer text</string>
    </property>
   </widget>
   <widget class="QPushButton" name="longest_text_button">
    <property name="geometry">
     <rect>
      <x>504</x>
      <y>60</y>
      <width>258</width>
      <height>27</height>
     </rect>
    </property>
    <property name="font">
     <font>
      <pointsize>12</pointsize>
     </font>
    </property>
    <property name="text">
     <string>This is a very long text for a button</string>
    </property>
   </widget>
   <widget class="QLabel" name="label_2">
    <property name="geometry">
     <rect>
      <x>10</x>
      <y>93</y>
      <width>159</width>
      <height>43</height>
     </rect>
    </property>
    <property name="font">
     <font>
      <pointsize>12</pointsize>
     </font>
    </property>
    <property name="text">
     <string>Your selection:</string>
    </property>
   </widget>
   <widget class="QPushButton" name="short_text_button">
    <property name="geometry">
     <rect>
      <x>175</x>
      <y>60</y>
      <width>158</width>
      <height>27</height>
     </rect>
    </property>
    <property name="font">
     <font>
      <pointsize>12</pointsize>
     </font>
    </property>
    <property name="text">
     <string>Short text</string>
    </property>
   </widget>
   <widget class="QLabel" name="label_3">
    <property name="geometry">
     <rect>
      <x>10</x>
      <y>11</y>
      <width>323</width>
      <height>43</height>
     </rect>
    </property>
    <property name="font">
     <font>
      <pointsize>12</pointsize>
      <weight>75</weight>
      <italic>true</italic>
      <bold>true</bold>
     </font>
    </property>
    <property name="text">
     <string>Welcome to the BUTTON APP</string>
    </property>
   </widget>
   <widget class="QLabel" name="selected_button_label">
    <property name="geometry">
     <rect>
      <x>175</x>
      <y>93</y>
      <width>587</width>
      <height>43</height>
     </rect>
    </property>
    <property name="font">
     <font>
      <pointsize>12</pointsize>
     </font>
    </property>
    <property name="text">
     <string>(no text button clicked)</string>
    </property>
   </widget>
   <widget class="QLabel" name="label">
    <property name="geometry">
     <rect>
      <x>10</x>
      <y>60</y>
      <width>159</width>
      <height>27</height>
     </rect>
    </property>
    <property name="font">
     <font>
      <pointsize>12</pointsize>
     </font>
    </property>
    <property name="text">
     <string>Choose a button:</string>
    </property>
   </widget>
  </widget>
  <widget class="QMenuBar" name="menubar">
   <property name="geometry">
    <rect>
     <x>0</x>
     <y>0</y>
     <width>783</width>
     <height>21</height>
    </rect>
   </property>
  </widget>
  <widget class="QStatusBar" name="statusbar"/>
 </widget>
 <resources/>
 <connections/>
</ui>

Hab probiert dann meine GUI in die von Snafu zu kopieren krieg dann aber eine Fehlermeldung.


P.S.: Wie kann ich im QtDesigner im Gridlayout sowas wie "Colspan" und die genaue Zuweisung von Widgets zu bestimmten Zellen modifizieren?
Benutzeravatar
__blackjack__
User
Beiträge: 13997
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@GMAch: Du hast die Widgets kopiert aber nicht das Layout. In der Kopie hast Du also pixelgenaue absolute Positionen und Grössen.

Colspan/Rowspan und Positionierung in Zellen geht einfach durch Grössenveränderung und Drag & Drop im Grid.
“The best book on programming for the layman is »Alice in Wonderland«; but that's because it's the best book on anything for the layman.” — Alan J. Perlis
Antworten