QT Creator richtig einrichten

Python und das Qt-Toolkit, erstellen von GUIs mittels des Qt-Designers.
Antworten
Kreser06
User
Beiträge: 33
Registriert: Samstag 21. Januar 2017, 11:49

Hallo zusammen,

ich versuche seit Tagen QT Creator ans Laufen zu bekommen, leider ohne Erfolg.
Was ich bisher gemacht habe:
  • QT mit einem Onlineinstaller installiert QT6.2.2
  • Python 3.10.1 von Python.org installiert
  • mit "python3 -m venv /path/to/new/virtual/environment" Virtuelle Umgebung erstellt im eigenen Ordner
  • mit "pip Install PySide6" PySide6 in den "Venv" Ordner installiert
dann Im QT Creator den Interpreter angepasst und ein neues Projekt erstellt.
Einfach nur ein Fenster mit einem PushButton und Einem Label.

Beim Klicken auf RUN wird nur ein leeres Fenster angezeigt und folgende Fehlermeldung wird angezeigt:

Code: Alles auswählen

qt.pysideplugin: Environment variable PYSIDE_DESIGNER_PLUGINS is not set, bailing out.
qt.pysideplugin: No instance of QPyDesignerCustomWidgetCollection was found.
Qt WebEngine seems to be initialized from a plugin. Please set Qt::AA_ShareOpenGLContexts using QCoreApplication::setAttribute and QSGRendererInterface::OpenGLRhi using QQuickWindow::setGraphicsApi before constructing QGuiApplication.
Ich habe schon alles "durchgegoogelt" aber ich finde nichts, was mir helfen kann. Vielleicht liegt es daran dass ich ein Absoluter Anfänger bin.

Hier sind noch mal die Codes:
mainwindow.py:

Code: Alles auswählen

# This Python file uses the following encoding: utf-8
import os
from pathlib import Path
import sys

from PySide6.QtWidgets import QApplication, QMainWindow
from PySide6.QtCore import QFile
from PySide6.QtUiTools import QUiLoader


class MainWindow(QMainWindow):
    def __init__(self):
        super(MainWindow, self).__init__()
        self.load_ui()

    def load_ui(self):
        loader = QUiLoader()
        path = os.fspath(Path(__file__).resolve().parent / "form.ui")
        ui_file = QFile(path)
        ui_file.open(QFile.ReadOnly)
        loader.load(ui_file, self)
        ui_file.close()


if __name__ == "__main__":
    app = QApplication([])
    widget = MainWindow()
    widget.show()
    sys.exit(app.exec())
form.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>460</width>
    <height>309</height>
   </rect>
  </property>
  <property name="windowTitle">
   <string>MainWindow</string>
  </property>
  <widget class="QWidget" name="centralwidget">
   <layout class="QVBoxLayout" name="verticalLayout">
    <item>
     <widget class="QLabel" name="lbl_hallo_welt">
      <property name="font">
       <font>
        <pointsize>34</pointsize>
       </font>
      </property>
      <property name="text">
       <string>Hallo</string>
      </property>
      <property name="alignment">
       <set>Qt::AlignCenter</set>
      </property>
     </widget>
    </item>
    <item>
     <widget class="QPushButton" name="btn_klick_mich">
      <property name="text">
       <string>Klick Mich!</string>
      </property>
     </widget>
    </item>
   </layout>
  </widget>
  <widget class="QMenuBar" name="menubar">
   <property name="geometry">
    <rect>
     <x>0</x>
     <y>0</y>
     <width>460</width>
     <height>24</height>
    </rect>
   </property>
  </widget>
  <widget class="QStatusBar" name="statusbar"/>
 </widget>
 <resources/>
 <connections/>
</ui>
WO/WIE soll ich PYSIDE_DESIGNER_PLUGINS einstellen/installieren?
Und QPyDesignerCustomWidgetCollection verwende ich auch nicht.

Ich hoffe ihr könnt mir weiter helfen.

Danke im Voraus
Kreser06
User
Beiträge: 33
Registriert: Samstag 21. Januar 2017, 11:49

Hallo noch mal,
also ich habe noch was anderes versucht und das Problem liegt wohl an PySide6.QtUiTools/QUiLoader.

Hier meine Versuche:
1. # File "PySide6_test.py":

Code: Alles auswählen

from PySide6.QtWidgets import QApplication, QMainWindow
from form import Ui_MainWindow

class MainWindow(QMainWindow, Ui_MainWindow):
    def __init__(self):
        super().__init__()
        self.setupUi(self)
        self.btn_klick_mich.clicked.connect(self.klick_mich_action)

    def klick_mich_action(self):
        if self.lbl_hallo_welt.text() != 'HALLO WELT!':
            self.lbl_hallo_welt.setText('HALLO WELT!')
        else:
          self.lbl_hallo_welt.setText('AUF WIEDERSEHEN!')

app = QApplication()
frm_main = MainWindow()
frm_main.show()
sys.exit(app.exec())
Das funktioniert ohne Fehlermeldungen, allerdings muss man nach jedem Bearbeiten der form.ui im QTCreator die "form.py" erstellen bzw. aktualisieren mit "pyside6-uic form.ui -o form.py"
Aber in PyCharm werden alle erstellten Objekte automatisch erkannt und können ausgewählt werden(Buttons, Labels usw.)

2.# File "PyQt6_test.py":

Code: Alles auswählen

import sys
from PyQt6.QtWidgets import QApplication, QMainWindow
from PyQt6.uic import *

class MainWindow(QMainWindow):
    def __init__(self):
        super(MainWindow, self).__init__()
        loadUi('form.ui', self)
        self.btn_klick_mich.clicked.connect(self.klick_mich_action)

    def klick_mich_action(self):
        if self.lbl_hallo_welt.text() != 'HALLO WELT!':
            self.lbl_hallo_welt.setText('HALLO WELT!')
        else:
            self.lbl_hallo_welt.setText('AUF WIEDERSEHEN!')

if __name__ == "__main__":
    app = QApplication([])
    widget = MainWindow()
    widget.show()
    sys.exit(app.exec())
Hier funktioniert das auch ohne Fehlermeldungen,
die Änderungen im QTCreator werden direkt übernommen und mann kann es direkt testen ohne "pyside6-uic form.ui -o form.py" im Terminal auszuführen.
ABER die Automatische Vervollständigung funktioniert nicht, man muss praktisch wissen wie das Objektname ist und den Code selbst schreiben(ist nicht so praktisch für einen Anfänger wie mich).

3.#File "MainWindow.py" (von QTCreator erstellt):

Code: Alles auswählen

import os
from pathlib import Path
import sys

from PySide6.QtWidgets import QApplication, QMainWindow
from PySide6.QtCore import QFile
from PySide6.QtUiTools import QUiLoader

class MainWindow(QMainWindow):
    def __init__(self):
        super(MainWindow, self).__init__()
        self.load_ui()

    def load_ui(self):
        loader = QUiLoader()
        path = os.fspath(Path(__file__).resolve().parent / "form.ui")
        ui_file = QFile(path)
        ui_file.open(QFile.ReadOnly)
        loader.load(ui_file, self)
        ui_file.close()

if __name__ == "__main__":
    app = QApplication([])
    widget = MainWindow()
    widget.show()
    sys.exit(app.exec())
Hier gibt es nach wie vor die Fehlermeldung und beim starten, wird nur ein leeres Fenster angezeigt:

Code: Alles auswählen

qt.pysideplugin: Environment variable PYSIDE_DESIGNER_PLUGINS is not set, bailing out.
qt.pysideplugin: No instance of QPyDesignerCustomWidgetCollection was found.
Qt WebEngine seems to be initialized from a plugin. Please set Qt::AA_ShareOpenGLContexts using QCoreApplication::setAttribute and QSGRendererInterface::OpenGLRhi using QQuickWindow::setGraphicsApi before constructing QGuiApplication.
Beim Googeln bin ich auf das hier gestoßen:
A new experimental plugin for Linux and Windows is shipped that provides > support for writing custom widgets in Python, which can then be selected > from Qt Designer to be used in layouts. Some extra magic is required to > enable this on macOS. We hope to have it ready in 6.1.1!
Da ich auch einen MAC benutze scheint es wohl daran zu liegen.

das habe ich hier gefunden.
Und da ich, wie schon erwähnt, ein Absoluter Anfänger bin, habe ich keine Ahnung was ich damit anstellen soll.
Ich hoffe mir kann trotzdem einer Helfen.
__deets__
User
Beiträge: 14494
Registriert: Mittwoch 14. Oktober 2015, 14:29

Laut Internet ist das eine Warnung. Kein Fehler. Kann also ignoriert werden. Funktioniert es denn sonst?
Kreser06
User
Beiträge: 33
Registriert: Samstag 21. Januar 2017, 11:49

Nein, es funktioniert nicht. Es wird nur ein leeres Fenster angezeigt, wenn ich es starte
raphael24
User
Beiträge: 2
Registriert: Donnerstag 13. Januar 2022, 14:58

Hallo Kreser 06, habe das gleiche Problem. Ich wäre froh wenn wir da eine Lösung finden.
raphael24
User
Beiträge: 2
Registriert: Donnerstag 13. Januar 2022, 14:58

Hallo zusammen,
ich habe zwei Lösungen gefunden:

1. Das UI-File wird in der Klasse eingebunden und dann in die Variable self.ui gepseichert damit man darauf zugreifen kann.

Code: Alles auswählen

# This Python file uses the following encoding: utf-8
import os
from pathlib import Path
import sys

from PySide6.QtWidgets import QApplication, QMainWindow, QWidget
from PySide6.QtCore import QFile, QIODevice, QCoreApplication, Qt
from PySide6.QtUiTools import QUiLoader

"""
Erstellt eine MainWindow Klasse und ruft in dieser das UI-File auf und zeigt es an. Das UI-File hat einen
Button und ein Label. Das Label tauscht den text wenn man den button drückt.
"""

path = os.fspath(Path(__file__).resolve().parent / "form_1.ui") #Pfad des UI-Files


class MainWindow(QMainWindow):
    def __init__(self, parent=None):
        super(MainWindow, self).__init__(parent)

        # ----- UI-File -----
        ui_file = QFile(path)                   #QFile Objekt erzeugen
        loader = QUiLoader()                            #QUiLoader initialisieren
        self.ui = loader.load(ui_file)                  #UI-File laden und in die variable self.ui speichern
        self.ui.show()                                  #UI-File anzeigen

        # ----- Titel -----
        self.ui.setWindowTitle("UI_File")               #Setzt den Titel vom MainWindow
        self.setWindowTitle("MainWindow")               #Setzt den Titel vom UI-File

        # ----- Button -----
        self.ui.Btn_Klickme.clicked.connect(self.show_text)

    def show_text(self):
        self.ui.L_Showtext.setText("Welcome to PySide6")


if __name__ == "__main__":
    app = QApplication([])
    widget = MainWindow()
    #widget.show()                                      #Das Anzeigen des MainWindow wird unterdrück.
    sys.exit(app.exec())

2. Das UI-File wird zuerst geladen und an die klasse MainWindow übergeben. In der Klasse selbst wird es in die variable self.ui gespeichert und ist somit verfügbar.

Code: Alles auswählen

# This Python file uses the following encoding: utf-8
import os
from pathlib import Path
import sys

from PySide6.QtWidgets import QApplication, QMainWindow
from PySide6.QtCore import QFile
from PySide6.QtUiTools import QUiLoader

"""
Ladet ein UI-File und übergibt dieses an der MainWindow-Klasse. Das UI-File hat einen
Button und ein Label. Das Label tauscht den text wenn man den button drückt.
"""



class MainWindow(QMainWindow):
    def __init__(self, parent=None):
        super().__init__(parent)
        self.ui = window                                            #hier wird das UI-File in die self.ui variable gespeichert

        # ----- WindowTitle -----
        self.ui.setWindowTitle("Python is Awesome")

        # ----- Button -----
        self.ui.Btn_Klickme.clicked.connect(self.show_text)

    def show_text(self):
        self.ui.L_Showtext.setText("Welcome to PySide6")



if __name__ == "__main__":
    app = QApplication([])
    
    loader = QUiLoader()                                            #QUiLoader initialisieren
    path = os.fspath(Path(__file__).resolve().parent / "form.ui")   #Pfad des UI-Files
    ui_file = QFile(path)                                           #QFile Objekt erzeugen
    ui_file.open(QFile.ReadOnly)
    window = loader.load(ui_file)                                   #UI-File laden und in die variable Window speichern
    window.show()                                                   #UI-File anzeigen
    ui_file.close()                                                 #QFile Objekt schliessen

    MainWindow = MainWindow(window)                                 #Klasse MainWindow erstellen und dieser das UI-File (variable <window>) übergeben
    sys.exit(app.exec())
Ich hoffe dir/euch hilft einer dieser beiden Lösungen weiter.
FG
Antworten