2017-11-29 2 views
1

사용자가 입력 상자를 여러 개 입력 할 수있는 입력 탭을 사용하는 프로그램이있어서 입력 상자가 채워지면 실행되고 다른 프로그램에서 입력 된 데이터가 실행됩니다 . 내 프로그램에 여러 개의 인스턴스를 실행할 수 있도록 탭을 동적으로 복제하는 더하기 기호가있는 탭 단추가 있어야합니다. 각 탭에서 동일한 이름을 사용하고 싶지만 끝에 변형이 있어야합니다. "EntryBox0", "EntryBox1", "EntryBox2".QTabWidget에서 탭을 복제하기위한 버튼

모든 탭에서 서식 (위젯 위치)을 동일하게 유지하면서 손쉬운 방법이 있습니까?

내 첫 번째 생각은 여러 탭을 수동으로 코딩하고 각 탭에 숨기기/숨김 해제 단추가 있지만 훨씬 많은 코드가됩니다.

enter image description here

나는 + 다음에 "탭이"기호를 추가하고 싶습니다. 모든 탭이 동일합니다. 위젯은 동일한 이름을 가지지 만 마지막에 탭이 사용되는 탭을 식별하는 동적 번호가 있습니다.


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_()) 

답변

1

QTabWidget 클래스는 탭 표시 줄에 단추를 추가하는 데 사용할 수있는 setCornerWidget 방법이있다. 이것은 탭 바의 왼쪽 또는 오른쪽 끝에 위치 할 수 있습니다 (마지막 탭 이후가 아님). 그러나 새 탭이있을 때 버튼이 움직이지 않기 때문에 더 친숙한 것처럼 보입니다. 덧붙였다. 탭 페이지에 대해 별도의 클래스를 만들어 탭 자체를 쉽게 복제 할 수 있습니다. 나는 무엇을 찾고 있어요

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

, 내 다른 질문은, 이미 QtDesigner 사용하여 레이아웃과 scrollareas 내 탭을 만들었습니다 :

아래는 것을 구현하는 간단한 데모 스크립트입니다 직접 탭 클래스로 가져올 수있는 방법이 있습니까? 즉, 나는 각 라벨/라인 에디트를 가지고 싶지 않다. – dre

+0

@dre. Qt Designer의 탭 위젯 안의 페이지에 모든 위젯을 추가했다고 가정합니다. 그렇다면 모든 위젯을 새로운 탭 페이지 위젯으로 이동하고 별도로 저장해야합니다. 이를 수행하는 쉬운 방법은 Object Inspector에서 탭을 선택한 다음 Shift 키를 누른 상태에서 해당 탭 아래의 마지막 하위 위젯을 클릭하는 것입니다. 그런 다음 위젯을 그룹으로 끌어서 새 양식에 놓고 여기에 레이아웃을 설정할 수 있습니다. 이전 탭은 모두 탭 위젯에서 제거해야합니다. 그런 다음 pyuic을 사용하여 메인 GUI 클래스처럼 가져올 수있는 탭 페이지 클래스 용 모듈을 생성 할 수 있습니다. – ekhumoro

+0

제공 한 코드로 내 게시물을 업데이트했습니다. 귀하의 의견을 따르려고합니다. 모든 탭을 QtDesigner의 새로운 폼에 복사하고 UI로 저장하고 모듈 생성을 위해 pyuic을 사용했습니다. 아무것도 얻지 못하고 있습니다. 분명히 잘못 입력하고있는 것 같습니다. 아마도 잘못 가져 왔을 것입니다. – dre

관련 문제