PyQt5 QtTabWidget; mit angepassten Edits/Labels (Groeße, Position)

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
3cosystem
User
Beiträge: 22
Registriert: Mittwoch 22. April 2020, 14:48

Hallo Leute,

ich versuche eine Oberflaeche mit TabWidgets zu gestalten, wo alle Elemente auf den Pixel genau angepasst sein sollen.
Die Oberflaeche besteht aus 60 Elementen.
Allerdings soll nach Ausfuehren das GUI noch bearbeitbar bleiben, was ich mit pyqtSlot und einem Worker realisieren moechte.
Bei Erstellung kann ich allerdings weder die Tabs noch die Elemente in Position und Groeße aendern. Sie sind immer maximal.
Das geht bei 60 Elementen aber nicht...
Wie kann ich das aendern?
Hier natuerlich mein Beispiel.
Vielen Dank im Voraus fuer die Hilfe

Code: Alles auswählen

#!/usr/bin/env python
# -*- encoding: utf-8 -*-
import sys
from PyQt5.QtCore import pyqtSlot
from PyQt5 import QtCore as qtc
from PyQt5 import QtWidgets as qtw


class Worker(qtc.QRunnable):
    def __init__(self, fn, *args, **kwargs):
        super(Worker, self).__init__()
        self.fn = fn
        self.args = args
        self.kwargs = kwargs

    @pyqtSlot()
    def run(self):
        self.fn(*self.args, **self.kwargs)


class Ui_MainWindow(qtw.QWidget):
    def __init__(self, master=None):
        super().__init__(master)
        self.setupUI()
        self.threadpool = qtc.QThreadPool()

    def setupUI(self):
        self.resize(400, 400)
        self.setStyleSheet("background-color: rgb(241, 231, 201)")
        self.setWindowTitle("Record Courses")
        self.beenden_btn = qtw.QPushButton(self)
        self.beenden_btn.setGeometry(qtc.QRect(200, 370, 80, 30))
        self.beenden_btn.setText("Start")

        self.layout = qtw.QVBoxLayout(self)
        # Initialize Tab
        self.TabC = self.createTabs()
        # Create Edit in Tab1
        self.Page1.layout = qtw.QVBoxLayout(self)
        self.Edit = qtw.QLineEdit()
        self.Edit.setGeometry(qtc.QRect(30, 70, 75, 23))  # Keine Auswirkung
        self.Page1.layout.addWidget(self.Edit)
        self.Page1.setLayout(self.Page1.layout)
        # Add Tab to widget
        self.layout.addWidget(self.TabC)
        self.setLayout(self.layout)

    def createTabs(self):
        self.Page1 = qtw.QWidget()
        self.TabWidget = qtw.QTabWidget()
        self.TabWidget.resize(400, 350)  # Keine Auswirkung, der Button soll immer sichtbar sein
        self.TabWidget.addTab(self.Page1, "Page1")

        return self.TabWidget


if __name__ == "__main__":
    app = qtw.QApplication(sys.argv)
    MainWindow = Ui_MainWindow()
    MainWindow.show()
    sys.exit(app.exec_())
Benutzeravatar
__blackjack__
User
Beiträge: 14052
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@3cosystem: Natürlich hat das setzen der Geometrie-Daten keine Auswirkungen wenn das Widget dann mit einem Layout angegordnet wird. Das ist doch gerade der Sinn von Layouts, das *die* sich um die passende Geometrie-Daten kümmern. Und das sollten sie auch. Was ist denn bitte an Deiner GUI so besonderes das Du glaubst Du könntest das besser als ein Layout und warum sollte gerade Deine GUI magischerweise mit festen Pixeln portabel funktionieren?

Du bindest zu viel an das Objekt. Bei einer Methode die einen Wert sowohl an das Objekt bindet *und* zurück gibt, damit der Aufrufer im *selben Objekt* das dann *nochmal* unter einem anderen Namen an das *selbe Objekt* bindet ist das mehr als offensichtlich, dass das keinen Sinn macht. Aber auch bei den ganzen anderen solltest Du schauen ob das wirklich zum Zustand des Objekts gehört, oder einfach nur ein lokaler Wert in der jeweiligen Methode ist.

In der Methode wird auch etwas an `Page1` gebunden, in der aufrufenden `__init__()` wird aber *auch* etwas an dieses Attribut gebunden. Das ist auch falsch. Es sind sogar verschiedene Dinge — einmal ein Layout und einmal ein Widget.

Namen: Du hältst Dich da weder an Python-Konventionen, noch an Qt-Konventionen. Entscheide Dich wenigstens für Qt wenn schon nicht Python.

Keine kryptischen Abkürzungen in Namen oder nummerierte Namen.

`setupUI()` ist als eigene Methode nicht sinnvoll, das gehört in die `__init__()`. Und warum `createTabs()` eine eigene Methode sein muss, sehe ich hier auch nicht.
“Vir, intelligence has nothing to do with politics!” — Londo Mollari
Antworten