2017-11-29 9 views
1

Ich habe ein Programm, das eine Eingabe-Registerkarte mit mehreren Eingabefeldern für einen Benutzer ausfüllt, und wenn diese Eingabefelder ausgefüllt sind, trete ich Run und ein anderes Programm wird die eingegebenen Daten ausführen . Ich möchte, dass in meinem Programm eine Tabulatortaste mit einem Pluszeichen vorhanden ist, mit der die Tabs dynamisch dupliziert werden, sodass ich mehrere Instanzen ausführen kann. Ich möchte für jede Registerkarte den gleichen Namen verwenden, aber am Ende eine Variante haben - z. "EntryBox0", "EntryBox1", "EntryBox2".Schaltfläche zum Duplizieren von Registerkarten in einem QTabWidget

Gibt es eine einfache Möglichkeit, dies zu tun, während die Formatierung (Widget-Positionen) auf allen Registerkarten gleich bleibt?

Mein erster Gedanke war, die mehreren Registerkarten manuell zu codieren und eine Schaltfläche zum Ein-/Ausblenden für jede Registerkarte zu haben, aber das wäre viel mehr Code.

enter image description here

würde Ich mag das + -Zeichen hinzuzufügen neben "Tab 2". Alle Registerkarten sind identisch. Die Widgets haben denselben Namen, aber am Ende haben sie eine dynamische Nummer, die angibt, welcher Tab verwendet wird.


from Stage import Ui_Form 
from Tabs import Ui_TabPage 

class TabPage(QWidget, Ui_TabPage): 
    def __init__(self, parent=None): 
     super().__init__(parent) 
     self.setupUi(self) 

class Stage(QMainWindow, Ui_Form): 
    def __init__(self, parent=None): 
     super().__init__(parent) 
     self.setupUi(self) 
     button = QtWidgets.QToolButton() 
     button.setToolTip('Add New Tab') 
     button.clicked.connect(self.addNewTab) 
     button.setIcon(self.style().standardIcon(
      QtWidgets.QStyle.SP_DialogYesButton)) 
     self.tabWidget.setCornerWidget(button, QtCore.Qt.TopRightCorner) 
     self.addNewTab() 

    def addNewTab(self): 
     text = 'Tab %d' % (self.tabWidget.count() + 1) 
     self.tabWidget.addTab(TabPage(self.tabWidget), text) 

if __name__ == '__main__': 

    app = QtWidgets.QApplication(sys.argv) 
    window = Stage() 
    window.setGeometry(600, 100, 300, 200) 
    window.show() 
    sys.exit(app.exec_()) 

Antwort

1

Die QTabWidget Klasse hat eine setCornerWidget Methode, die verwendet werden können, auf eine Schaltfläche auf die Registerkarte Leiste hinzuzufügen. Dies kann nur am linken oder am rechten Ende der Tab-Leiste positioniert werden (anstatt nach der letzten Tab-Taste) - aber für mich scheint das benutzerfreundlicher, da die Schaltfläche nicht verschoben wird, wenn eine neue Registerkarte ist hinzugefügt. Die Registerkarten selbst können einfach dupliziert werden, indem eine separate Klasse für die Registerkarte erstellt wird.

Es folgt ein einfaches Demo-Skript, das implementiert, dass:

screenshot

import sys 
from PyQt5 import QtCore, QtWidgets 

class TabPage(QtWidgets.QWidget): 
    def __init__(self, parent=None): 
     super().__init__(parent) 
     group = QtWidgets.QGroupBox('Monty Python') 
     layout = QtWidgets.QVBoxLayout(self) 
     layout.addWidget(group) 
     grid = QtWidgets.QGridLayout(group) 
     grid.addWidget(QtWidgets.QLabel('Enter a name:'), 0, 0) 
     grid.addWidget(QtWidgets.QLabel('Choose a number:'), 0, 1) 
     grid.addWidget(QtWidgets.QLineEdit(), 1, 0) 
     grid.addWidget(QtWidgets.QComboBox(), 1, 1) 
     grid.addWidget(QtWidgets.QPushButton('Click Me!'), 1, 2) 
     grid.addWidget(QtWidgets.QSpinBox(), 2, 0) 
     grid.addWidget(QtWidgets.QPushButton('Clear Text'), 2, 2) 
     grid.addWidget(QtWidgets.QTextEdit(), 3, 0, 1, 3) 

class Window(QtWidgets.QWidget): 
    def __init__(self): 
     super().__init__() 
     self.tabs = QtWidgets.QTabWidget() 
     layout = QtWidgets.QVBoxLayout(self) 
     layout.addWidget(self.tabs) 
     button = QtWidgets.QToolButton() 
     button.setToolTip('Add New Tab') 
     button.clicked.connect(self.addNewTab) 
     button.setIcon(self.style().standardIcon(
      QtWidgets.QStyle.SP_DialogYesButton)) 
     self.tabs.setCornerWidget(button, QtCore.Qt.TopRightCorner) 
     self.addNewTab() 

    def addNewTab(self): 
     text = 'Tab %d' % (self.tabs.count() + 1) 
     self.tabs.addTab(TabPage(self.tabs), text) 

if __name__ == '__main__': 

    app = QtWidgets.QApplication(sys.argv) 
    window = Window() 
    window.setGeometry(600, 100, 300, 200) 
    window.show() 
    sys.exit(app.exec_()) 
+0

Das ist, was ich suche, meine andere Frage ist, ich habe bereits meine Tab mit QtDesigner mit Layouts und scrollareas gemacht, Gibt es eine Möglichkeit, es direkt in die Tab-Klasse zu importieren? Mit anderen Worten, ich möchte nicht für jedes Label/Zeile, das ich habe, etwas hinzufügen müssen. – dre

+0

@dre. Ich gehe davon aus, dass Sie alle Widgets einer Seite innerhalb des Tab-Widgets in Qt Designer hinzugefügt haben. Wenn dies der Fall ist, müssen Sie alle diese Widgets in ein neues Tab-Page-Widget verschieben und separat speichern. Eine einfache Möglichkeit besteht darin, die Registerkarte im Objektinspektor auszuwählen, dann die Umschalttaste gedrückt zu halten und auf das letzte Kind-Widget unter dieser Registerkarte zu klicken. Sie können die Widgets als Gruppe auf ein neues Formular ziehen und dort ablegen und ein Layout darauf setzen. Alle alten Tabs sollten aus dem Tab-Widget entfernt werden. Dann können Sie mit pyuic ein Modul für die Tab-Page-Klasse generieren, das genau wie die Haupt-GUI-Klasse importiert werden kann. – ekhumoro

+0

Ich habe meinen Beitrag mit dem von Ihnen bereitgestellten Code aktualisiert. Ich versuche, dem zu folgen, was Sie sagen. Ich habe alle Registerkarte in ein neues Formular in QtDesigner kopiert und als UI gespeichert und pyuic verwendet, um das Modul zu generieren, ich bekomme nichts, ich mache offensichtlich etwas falsch, wahrscheinlich importieren Sie es falsch. – dre

Verwandte Themen