QTabWidget에서 사용자 정의 클래스를 사용할 수 없습니다.

WhoDatBoy

편집 : 표현 및 최소한의 재현 가능한 예 포함

개체 이름이 PyQt5에서 작동하는 방식 / OOP가 PyQt5에서 작동하는 방식에 대한 질문이 있습니다.

배경

QTabWidget을 포함하는 프로젝트를 진행 중입니다. 이 QTabWidget은 '+'탭을 클릭 할 때마다 새 탭을 추가합니다. 클릭
전 :

원래 탭

클릭 후 :

새 탭 추가

를 사용하여 새 탭을 빈 위젯으로 추가하면 insertNewRegionTab()모든 것이 제대로 작동합니다. 그러나 QtWidgets.QWidget (customTab)의 파생 클래스 인 사용자 지정 클래스대신 사용 하면 프로그램이 충돌합니다. 각 탭이 개체간에 동일한 서식 / 내부 관계를 가지도록이 클래스를 만들었고 '+'버튼으로 필요한만큼 추가 할 수있었습니다.

충돌은 이름 충돌 때문일 수 있다고 생각합니다. 예를 들어 "label1"이라는 레이블이 두 개의 탭에 동시에 만들어지는 것과 같습니다.

질문

문제는 각 customTab이 자체 개체 인 경우 이름 충돌이 어떻게 문제가 될 수 있는지 알 수 없다는 것입니다. 이 customTab 클래스를 원하는 방식으로 구현할 수없는 이유를 아는 사람이 있는지 궁금합니다.

제안 된 해법

해결책에 대한 내 생각은 클래스 카운터를 정의한 다음 새 탭이 추가 될 때마다 증가하여 모두 고유 한 이름을 갖도록하는 것입니다. 그러나 이것은 약간의 작업이므로 이것이 실제로 문제가 이전인지 확인하고 싶었습니다. 나는 그것을 구현합니다.

암호

주의-이 코드를 사용하는 두 개의 원래 탭에는 이름이 없습니다. 왼쪽에있는 'Test 1'에는 콤보 상자가 있으며 customTab 클래스에 있습니다. 오른쪽에있는 '+'는 새 탭을 추가하지만 customTab 개체 대신 일반 QWidget을 추가합니다.

from PyQt5 import QtCore, QtGui, QtWidgets


class topLevelWindow(QtWidgets.QMainWindow):
    def __init__(self):
        # Function that is used to add tabs
        def insertNewRegionTab(self):
            if self.mainTabWidgetCount == 1 + self.mainTabWidget.currentIndex():
                
                # Attempted method 1:
                tab = QtWidgets.QWidget()  # Want this to be a customTab not a QWidget
                self.mainTabWidget.insertTab(self.mainTabWidget.currentIndex(),
                                              tab, "Tab " + str(self.mainTabWidgetCount))

                # Attempted method 2:
                # self.tabInstaces.append(customTab(self.mainTabWidget))

                self.mainTabWidgetCount += 1

        super().__init__()
        # Initialization of main window
        self.setObjectName("MainWindow")
        self.resize(500, 300)
        self.centralwidget = QtWidgets.QWidget(self)
        self.centralwidget.setObjectName("centralwidget")
        self.gridLayout_5 = QtWidgets.QGridLayout(self.centralwidget)
        self.gridLayout_5.setObjectName("gridLayout_5")

        # Create the main tab widget and set properties
        self.mainTabWidget = QtWidgets.QTabWidget(self.centralwidget)
        self.mainTabWidget.setObjectName("mainTabWidget")
        self.mainTabWidget.setCurrentIndex(0)
        self.gridLayout_5.addWidget(self.mainTabWidget, 1, 1, 1, 1)
        self.setCentralWidget(self.centralwidget)

        # Insert a tab (of the custom, pre-formatted tab class) into this tab widget
        self.tabInstances = [customTab(self.mainTabWidget)]
        self.mainTabWidgetCount = 2

        # Add the tab which creates other tabs to the tan widget
        self.addRegionTab = QtWidgets.QWidget()
        self.addRegionTab.setObjectName("addRegionTab")
        self.mainTabWidget.addTab(self.addRegionTab, "")

        # Add functionality: When '+' tab is selected, add a tab
        self.mainTabWidget.currentChanged.connect(lambda: insertNewRegionTab(self))

        # Show window
        self.show()


class customTab(QtWidgets.QWidget):
    def __init__(self, parent=None):
        # Initializes the object itself and renames it. Add vertical layout to it
        super(customTab, self).__init__()
        self.setObjectName("tabInstances")
        self.verticalLayout = QtWidgets.QVBoxLayout(self)
        self.verticalLayout.setObjectName("verticalLayout")

        self.comboBox1 = QtWidgets.QComboBox(self)
        self.comboBox1.setObjectName("comboBox1")
        self.comboBox1.addItem("")
        self.comboBox1.addItem("")


        # Add self to parent
        parent.addTab(self, "")




if __name__ == "__main__":
    import sys

    app = QtWidgets.QApplication(sys.argv)

    MainWindow = topLevelWindow()

    sys.exit(app.exec_())

Eyllanesc

OP의 논리를 이해하지 못하는 이유는 문제와 관련이없는 objectName ()에 대해 묻기 때문에 objectName은 요소를 식별 할 수있는 이름 일뿐입니다.

내 대답에서 나는 누를 때 탭을 추가 해야하는 버튼을 만드는 방법을 보여줍니다.

from PyQt5 import QtCore, QtGui, QtWidgets


class TabWidget(QtWidgets.QTabWidget):
    plusClicked = QtCore.pyqtSignal()

    def __init__(self, parent=None):
        super().__init__(parent)
        self.tabBar().installEventFilter(self)

        self.add_button = QtWidgets.QToolButton(self, text="+")
        self.add_button.clicked.connect(self.plusClicked)

    def eventFilter(self, obj, event):
        if obj is self.tabBar() and event.type() == QtCore.QEvent.Resize:
            r = self.tabBar().geometry()
            h = r.height()
            self.add_button.setFixedSize((h - 1) * QtCore.QSize(1, 1))
            self.add_button.move(r.right(), 0)
        return super().eventFilter(obj, event)


class topLevelWindow(QtWidgets.QMainWindow):
    def __init__(self):
        super().__init__()
        # Initialization of main window
        self.setObjectName("MainWindow")
        self.resize(500, 300)
        self.centralwidget = QtWidgets.QWidget(self)
        self.setCentralWidget(self.centralwidget)

        lay = QtWidgets.QGridLayout(self.centralwidget)

        # Create the main tab widget and set properties
        self.mainTabWidget = TabWidget()
        self.mainTabWidget.setObjectName("mainTabWidget")
        self.mainTabWidget.setCurrentIndex(0)
        lay.addWidget(self.mainTabWidget, 1, 1, 1, 1)

        self.mainTabWidget.addTab(CustomWidget(), "Tab1")
        self.mainTabWidget.plusClicked.connect(self.add_clicked)

    def add_clicked(self):
        index = self.mainTabWidget.count() + 1
        self.mainTabWidget.addTab(CustomWidget(), "Tab {}".format(index))


class CustomWidget(QtWidgets.QWidget):
    def __init__(self, parent=None):
        # Initializes the object itself and renames it. Add vertical layout to it
        super(CustomWidget, self).__init__(parent)

        self.comboBox1 = QtWidgets.QComboBox()
        self.comboBox1.addItems(list("abcdef"))

        lay = QtWidgets.QVBoxLayout(self)
        lay.addWidget(self.comboBox1)


if __name__ == "__main__":
    import sys

    app = QtWidgets.QApplication(sys.argv)

    w = topLevelWindow()
    w.show()

    sys.exit(app.exec_())

이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.

침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제

에서 수정
0

몇 마디 만하겠습니다

0리뷰
로그인참여 후 검토

관련 기사

분류에서Dev

laravel의 사용자 정의 클래스에서 호출 할 때 클래스를 찾을 수 없습니다.

분류에서Dev

서비스 클래스에서 자신의 클래스를 사용할 수 없습니다.

분류에서Dev

C #의 웹 서비스에서 사용자 지정 클래스를 반환 할 수 없습니다.

분류에서Dev

CakePHP : 사용자 정의 패키지에서 클래스를로드 할 수 없습니다.

분류에서Dev

사용자 정의 클래스를 사용할 때 클래스를 찾을 수 없습니다.

분류에서Dev

사용자 정의보기에서 typedarray를 사용할 수 없습니다.

분류에서Dev

Kotlin에서 개체의 슈퍼 클래스 생성자에서 상수를 사용할 수 없습니다.

분류에서Dev

QStandardItem에 사용자 정의 클래스를 추가 할 수 있습니까?

분류에서Dev

Laravel 5.4 애플리케이션은 사용자 정의 디렉토리에 사용자 정의 클래스를로드 할 수 없습니다.

분류에서Dev

Parse에서 사용자 지정 클래스 개체를 저장할 수 없습니다.

분류에서Dev

다른 클래스의 메서드를 사용할 수 없습니까?

분류에서Dev

클래스에서 addEventListener ()를 사용할 수 없습니다.

분류에서Dev

C #에서 WMI 클래스를 사용할 수 없습니다.

분류에서Dev

Kotlin : IllegalAccessException : BlockJUnit4ClassRunner 클래스가 "private"수정자를 사용하여 Foo 클래스의 구성원에 액세스 할 수 없습니다.

분류에서Dev

사용자 정의 클래스의 배열에 액세스 할 수 없습니다.

분류에서Dev

MFC에서 문자열 및 CString 클래스를 사용할 수 없습니다.

분류에서Dev

MFC에서 문자열 및 CString 클래스를 사용할 수 없습니다.

분류에서Dev

scala slick 2.0.2는 사용자 정의 클래스에 자동 매핑 할 수 없습니다.

분류에서Dev

Ksoap : 웹 메서드에 매개 변수로 사용자 정의 클래스를 전달할 때 예외를 직렬화 할 수 없습니다.

분류에서Dev

사용자 정의 MessageBodyWriter 내에서 HttpServletRequest에 액세스 할 수 없습니다.

분류에서Dev

클래스에 롬복 @NoArgsConstructor를 사용할 수 없습니다

분류에서Dev

내부 클래스에 CRTP를 사용할 수 없습니다.

분류에서Dev

react-navigation-stack을 사용하여 다른 구성 요소에 대한 사용자 정의 헤더로 클래스 구성 요소를 사용할 때 "클래스를 함수로 호출 할 수 없습니다"오류가 발생합니다.

분류에서Dev

자바 : MySQL의에서 "사용"키워드를 사용할 수 없습니다?

분류에서Dev

사용자 지정 클래스 드롭 다운 Xcode 8.3.2에서 사용자 지정 컨트롤러 클래스를 찾을 수 없습니다.

분류에서Dev

데이터는 AsynTask 클래스의 사용자 지정 목록보기에 도달 할 수 없습니다.

분류에서Dev

다른 클래스에서 사용자의 jEditorPane에 액세스 할 수 없습니다.

분류에서Dev

Nifi JSON ETL : 사용자 정의 변환 클래스 JoltTransformJSON 프로세서를 찾을 수 없습니다

분류에서Dev

JavaScript 또는 TypeScripe의 사용자 정의 클래스에서 인덱서를 구현할 수 있습니까?

Related 관련 기사

  1. 1

    laravel의 사용자 정의 클래스에서 호출 할 때 클래스를 찾을 수 없습니다.

  2. 2

    서비스 클래스에서 자신의 클래스를 사용할 수 없습니다.

  3. 3

    C #의 웹 서비스에서 사용자 지정 클래스를 반환 할 수 없습니다.

  4. 4

    CakePHP : 사용자 정의 패키지에서 클래스를로드 할 수 없습니다.

  5. 5

    사용자 정의 클래스를 사용할 때 클래스를 찾을 수 없습니다.

  6. 6

    사용자 정의보기에서 typedarray를 사용할 수 없습니다.

  7. 7

    Kotlin에서 개체의 슈퍼 클래스 생성자에서 상수를 사용할 수 없습니다.

  8. 8

    QStandardItem에 사용자 정의 클래스를 추가 할 수 있습니까?

  9. 9

    Laravel 5.4 애플리케이션은 사용자 정의 디렉토리에 사용자 정의 클래스를로드 할 수 없습니다.

  10. 10

    Parse에서 사용자 지정 클래스 개체를 저장할 수 없습니다.

  11. 11

    다른 클래스의 메서드를 사용할 수 없습니까?

  12. 12

    클래스에서 addEventListener ()를 사용할 수 없습니다.

  13. 13

    C #에서 WMI 클래스를 사용할 수 없습니다.

  14. 14

    Kotlin : IllegalAccessException : BlockJUnit4ClassRunner 클래스가 "private"수정자를 사용하여 Foo 클래스의 구성원에 액세스 할 수 없습니다.

  15. 15

    사용자 정의 클래스의 배열에 액세스 할 수 없습니다.

  16. 16

    MFC에서 문자열 및 CString 클래스를 사용할 수 없습니다.

  17. 17

    MFC에서 문자열 및 CString 클래스를 사용할 수 없습니다.

  18. 18

    scala slick 2.0.2는 사용자 정의 클래스에 자동 매핑 할 수 없습니다.

  19. 19

    Ksoap : 웹 메서드에 매개 변수로 사용자 정의 클래스를 전달할 때 예외를 직렬화 할 수 없습니다.

  20. 20

    사용자 정의 MessageBodyWriter 내에서 HttpServletRequest에 액세스 할 수 없습니다.

  21. 21

    클래스에 롬복 @NoArgsConstructor를 사용할 수 없습니다

  22. 22

    내부 클래스에 CRTP를 사용할 수 없습니다.

  23. 23

    react-navigation-stack을 사용하여 다른 구성 요소에 대한 사용자 정의 헤더로 클래스 구성 요소를 사용할 때 "클래스를 함수로 호출 할 수 없습니다"오류가 발생합니다.

  24. 24

    자바 : MySQL의에서 "사용"키워드를 사용할 수 없습니다?

  25. 25

    사용자 지정 클래스 드롭 다운 Xcode 8.3.2에서 사용자 지정 컨트롤러 클래스를 찾을 수 없습니다.

  26. 26

    데이터는 AsynTask 클래스의 사용자 지정 목록보기에 도달 할 수 없습니다.

  27. 27

    다른 클래스에서 사용자의 jEditorPane에 액세스 할 수 없습니다.

  28. 28

    Nifi JSON ETL : 사용자 정의 변환 클래스 JoltTransformJSON 프로세서를 찾을 수 없습니다

  29. 29

    JavaScript 또는 TypeScripe의 사용자 정의 클래스에서 인덱서를 구현할 수 있습니까?

뜨겁다태그

보관