Qt-Creator File sieht in Python importiert anders aus

Python und das Qt-Toolkit, erstellen von GUIs mittels des Qt-Designers.
Antworten
Olaf de Viesel
User
Beiträge: 4
Registriert: Samstag 13. August 2016, 16:17

Hi Leute,

und zwar habe ich mir mit dem Qt-Creator eine GUI zusammengebastelt. Nun nehme ich die generierte ui- Datei und importiere sie mittels

Code: Alles auswählen

uic.loadUi("pfad", self)
in mein Python-Projekt. Das funktioniert auch alles ohne Probleme.
Nun habe ich jedoch das Problem, das die Oberfläche im Qt-Creator anders aussieht, als in meinem Python-Projekt.
Ich programmiere mit der IDE PyCharm (V. 2016.2.1) und dem QT-Creator in der Version 4.0.3 sowie Python 3.5.2.

Es sieht so aus, als würde mein Python-Projekt noch zusätzliche Margins hinzufügen. Auch stimmt die Minimum-Size meines Buttons nicht. So habe ich im Creator angegeben, das mein Button eine minimale Größe von 150x50 haben solle. Wenn ich jedoch die Größe des Buttons im Code mit

Code: Alles auswählen

self.btn.sizeHint()
mir ausgeben lasse, kommt er nur auf eine Größe von 116x40. Ich habe in der Doku gelesen, das der Default-Margin-Wert 11px sein soll. Ich habe im Creator jedoch die kompletten Werte auf 0 gesetzt gehabt.

Der Button liegt auf einem Grid-Layout das wiederum auf dem kompletten Hintergrund-Layout liegt, welches ein Vertical Layout ist. Weitere Anpassungen bzw. Einstellungen werden im Code nicht vorgenommen.

Werden die Werte von Python beim importieren bzw. interpretieren überschrieben? Wie kann ich Python sagen, das es genauso aussehen soll, wie im Creator? ^^

Button im Creator-Projekt:
Bild

Button im Python-Projekt:
Bild

Viele Grüße
Olaf
Olaf de Viesel
User
Beiträge: 4
Registriert: Samstag 13. August 2016, 16:17

:idea: Okay, ich habe aufgrund folgenden Threads eine Lösung gefunden: http://stackoverflow.com/questions/2423 ... nd-mdiarea

Man muss tatsächlich den einzelnen Layouts explizit sagen, das die Margin-Werte auf 0 gesetzt werden soll:

Code: Alles auswählen

main_window.btn_layout.setContentsMargins(0, 0, 0, 0)
Und siehe da, es funktioniert. :roll:

Warum Python das jedoch nicht automatisch vom Qt Creator übernimmt, bleibt mir ein Rätsel.

P.s.: Sorry für den Doppelpost, aber ich kann meinen eigenen Beitrag leider nicht mehr editieren ^^
BlackJack

@Olaf de Viesel: Ich kann das Problem mit dem Rand nicht nachvollziehen. Bei mir ist da keiner. Zeig doch mal ein minimales, lauffähiges Beispiel einer UI-Datei + Python-Code welches das Problem zeigt.

Das zweite Problem ist auch keines: `sizeHint()` liefert die Grösse die das Layout von sich aus gerne vergeben würde. Das muss nicht die `minimumSize()` sein.

Code: Alles auswählen

        uic.loadUi('test.ui', self)
        print(self.button.sizeHint())
        print(self.button.minimumSize())
        print(self.button.size())
Ausgabe:
[codebox=text file=Unbenannt.txt]PyQt4.QtCore.QSize(77, 24)
PyQt4.QtCore.QSize(150, 50)
PyQt4.QtCore.QSize(150, 50)[/code]
Olaf de Viesel
User
Beiträge: 4
Registriert: Samstag 13. August 2016, 16:17

BlackJack hat geschrieben:@Olaf de Viesel: Ich kann das Problem mit dem Rand nicht nachvollziehen. Bei mir ist da keiner. Zeig doch mal ein minimales, lauffähiges Beispiel einer UI-Datei + Python-Code welches das Problem zeigt.

Das zweite Problem ist auch keines: `sizeHint()` liefert die Grösse die das Layout von sich aus gerne vergeben würde. Das muss nicht die `minimumSize()` sein.
Okay, danke für die Erklärung mit dem sizeHint(). Habe ich so nicht gewusst.

Ich habe hier mal ein minimales Beispiel für dich:

test.py:

Code: Alles auswählen

import sys
from PyQt5 import uic
from PyQt5.QtWidgets import QMainWindow, QApplication


class MainWindow(QMainWindow):
    def __init__(self):
        super().__init__()
        # Set up the user interface from Designer.
        main_window = uic.loadUi("gui/mainwindow2.ui", self)


if __name__ == '__main__':
    app = QApplication(sys.argv)
    ex = MainWindow()
    ex.show()
    sys.exit(app.exec_())
Ist im Prinzip nichts außergewöhnliches. Ich bevorzuge nur gerne die Klassenschreibweise. ^^'

Und hier die UI-Datei in XML-Format wie sie der Creator baut:

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>900</width>
    <height>600</height>
   </rect>
  </property>
  <property name="sizePolicy">
   <sizepolicy hsizetype="Fixed" vsizetype="Fixed">
    <horstretch>0</horstretch>
    <verstretch>0</verstretch>
   </sizepolicy>
  </property>
  <property name="maximumSize">
   <size>
    <width>900</width>
    <height>600</height>
   </size>
  </property>
  <property name="windowTitle">
   <string>MainWindow</string>
  </property>
  <widget class="QWidget" name="centralWidget">
   <property name="maximumSize">
    <size>
     <width>900</width>
     <height>559</height>
    </size>
   </property>
   <layout class="QVBoxLayout" name="verticalLayout">
    <item>
     <layout class="QHBoxLayout" name="horizontalLayout">
      <property name="spacing">
       <number>0</number>
      </property>
      <item>
       <widget class="QPushButton" name="pushButton_5">
        <property name="sizePolicy">
         <sizepolicy hsizetype="Minimum" vsizetype="Preferred">
          <horstretch>0</horstretch>
          <verstretch>0</verstretch>
         </sizepolicy>
        </property>
        <property name="text">
         <string>PushButton</string>
        </property>
       </widget>
      </item>
     </layout>
    </item>
    <item>
     <widget class="Line" name="line">
      <property name="orientation">
       <enum>Qt::Horizontal</enum>
      </property>
     </widget>
    </item>
   </layout>
  </widget>
  <widget class="QMenuBar" name="menuBar">
   <property name="geometry">
    <rect>
     <x>0</x>
     <y>0</y>
     <width>900</width>
     <height>21</height>
    </rect>
   </property>
  </widget>
  <widget class="QStatusBar" name="statusBar"/>
 </widget>
 <layoutdefault spacing="6" margin="11"/>
 <resources/>
 <connections/>
</ui>
Folgende Bilder ergeben sich daraus:
qt_creator:
Bild

pycharm:
Bild

Kann das sein, das es mit dem pyqt5-Package zu tun hat? Interessanterweise ist jedoch die Horizontale Linie nicht davon betroffen. Es verwirrt mich :D
Zuletzt geändert von Anonymous am Dienstag 16. August 2016, 20:39, insgesamt 1-mal geändert.
Grund: Quelltext in Codebox-Tags gesetzt.
BlackJack

@Olaf de Viesel: Also ich habe hier kein Qt5 installiert und mit PyQt4 sieht das so aus wie die Vorschau aus dem Qt-Designer. Die 11 Pixel Abstand stehen bei Dir übrigens im XML im <defaultlayout>-Tag. Ist der Qt-Designer den Du verwendest denn für Qt5?
Olaf de Viesel
User
Beiträge: 4
Registriert: Samstag 13. August 2016, 16:17

Folgenden qt-Creator nutze ich:

Bild

Da ich relativ neu im Python-Kontext programmiere, habe ich mir natürlich erst einmal das neuste vom Neuen genommen. :D Bei meinen Recherchen/ Tutorials ist mir jedoch auch aufgefallen, das pyqt4 noch in aller Munde ist und noch sehr oft benutzt wird.
Ich hatte auch schon mal überlegt, ob ich mir mal pyqt4 installiere und es damit teste. Da jedoch mein Workaround erst einmal funktioniert, zumindest im Windows-Kontext, habe ich diesen Ansatz nicht weiter verfolgt.
Die 11 Pixel Abstand stehen bei Dir übrigens im XML im <defaultlayout>-Tag.


Richtig. Wenn ich jedoch diesen Tag entferne, dann ist ALLES am Rand des Windows Fenster. Sprich, es gibt gar keinen Rand mehr.
Also wenn es bei Dir keine Probleme macht, kann es ja nur an pyqt5 liegen, denn das ist im Prinzip der einzige Unterschied. :/
Antworten