简体   繁体   中英

Pyside- Add Widget from another class

I am trying to build a layout using PySide and I have run into a situation where I would like to keep a widget group in a separate class and call it dynamically. I looked at few examples from this site which sort of gives me an idea but still I am not able to resolve this issue on my own. Here is the sample code of the layout I am building and it will be very helpful if someone can help me solve this issue. -Thanks in advance

import PySide2.QtCore as QtCore
import PySide2.QtGui as QtGui
import PySide2.QtWidgets as QtGuiWidgets



class TabDialog(QtGuiWidgets.QDialog):
    def __init__(self, parent=None):
        super(TabDialog, self).__init__(parent)
        argument = "Temp"

        calldisplay = display_elements()

        tabWidget = QtGuiWidgets.QTabWidget()
        tabWidget.addTab(tab1(argument), "tab1")
        tabWidget.addTab(tab2(argument), "tab2")


        buttonBox = QtGuiWidgets.QDialogButtonBox(
            QtGuiWidgets.QDialogButtonBox.Ok | QtGuiWidgets.QDialogButtonBox.Cancel)

        buttonBox.accepted.connect(self.accept)
        buttonBox.rejected.connect(self.reject)

        mainLayout = QtGuiWidgets.QVBoxLayout()
        mainLayout.addWidget(tabWidget)
        mainLayout.addWidget(buttonBox)
        self.setLayout(mainLayout)

        self.setWindowTitle("Load All Elements")
        self.show()


class tab1(QtGuiWidgets.QWidget):
    def __init__(self, calldisplay, parent=None):
        super(tab1, self).__init__(parent)

        self.layerfilterGroup = QtGuiWidgets.QLabel("Filter 1")
        self.peopleGroup = QtGuiWidgets.QGroupBox("Filter 2")
        self.dateGroup = QtGuiWidgets.QGroupBox("Filter 3")
        self.loadGroup = QtGuiWidgets.QLabel("Load elements")

        self.filterGroup = QtGuiWidgets.QGroupBox("Filters")
        self.filterGroup.setGeometry(100, 100, 700, 550)
        self.filterLayout = QtGuiWidgets.QVBoxLayout()

        for key in range(15):
            self.btn = QtGuiWidgets.QCheckBox(str(key))
            self.btn.setChecked(True)
            self.filterLayout.addWidget(self.btn)
        self.filterGroup.setLayout(self.filterLayout)

        self.filterscroll = QtGuiWidgets.QScrollArea()
        self.fslayout = QtGuiWidgets.QVBoxLayout()
        self.filterscroll.setWidget(self.filterGroup)
        self.fslayout.addWidget(self.filterscroll)

        self.artist = ["All", "N/A", "N/A", "N/A"]
        self.acombos = QtGuiWidgets.QComboBox()
        self.acombos.addItems(self.artist)

        self.all_label = QtGuiWidgets.QLabel()
        self.all_label.setText('All')
        self.all_label.setGeometry(160, 40, 80, 30)

        self.late_label = QtGuiWidgets.QLabel()
        self.late_label.setText('Latest')
        self.late_label.setGeometry(160, 40, 80, 30)

        self.dslider = QtGuiWidgets.QSlider(QtCore.Qt.Horizontal, self)

        self.artistlayout = QtGuiWidgets.QVBoxLayout()
        self.artistlayout.addWidget(self.acombos)
        self.peopleGroup.setLayout(self.artistlayout)

        self.datelayout = QtGuiWidgets.QHBoxLayout()
        self.datelayout.addWidget(self.all_label)
        self.datelayout.addWidget(self.dslider)
        self.datelayout.addWidget(self.late_label)
        self.dateGroup.setLayout(self.datelayout)

        self.rgroup = QtGuiWidgets.QGroupBox("Elements")
        self.rgroup.setGeometry(100, 100, 700, 750)
        self.rlayout = QtGuiWidgets.QVBoxLayout()


########## This is Working###############
        for key in range(15):
            self.btn = QtGuiWidgets.QCheckBox(str(key))
            self.btn.setChecked(True)
            self.rlayout.addWidget(self.btn)
        self.rgroup.setLayout(self.rlayout)

############ want to do it this way############

        #self.rlayout.addWidget(calldisplay)
        #self.rgroup.setLayout(self.rlayout)

        self.rscroll = QtGuiWidgets.QScrollArea()
        self.rlayout = QtGuiWidgets.QVBoxLayout()
        self.rscroll.setWidget(self.rgroup)
        self.rlayout.addWidget(self.rscroll)

        self.mainLayout = QtGuiWidgets.QVBoxLayout()
        self.mainLayout.addWidget(self.layerfilterGroup)
        self.mainLayout.addWidget(self.filterscroll)
        self.mainLayout.addWidget(self.peopleGroup)
        self.mainLayout.addWidget(self.dateGroup)
        self.mainLayout.addWidget(self.loadGroup)
        self.mainLayout.addWidget(self.rscroll)
        self.setLayout(self.mainLayout)

##### call this class dynamically######
class display_elements(QtGuiWidgets.QWidget):
    def __init__(self, parent=None):
        super(display_elements, self).__init__(parent)
        self.rgroup = QtGuiWidgets.QGroupBox("Available Elements")
        self.rgroup.setGeometry(400, 400, 700, 750)

        self.rlayout = QtGuiWidgets.QVBoxLayout()

        for key in range(15):
            self.btn = QtGuiWidgets.QCheckBox(str(key))
            self.btn.setChecked(True)
            self.rlayout.addWidget(self.btn)
        self.rgroup.setLayout(self.rlayout)



class tab2(QtGuiWidgets.QWidget):
    def __init__(self, fileInfo, parent=None):
        super(tab2, self).__init__(parent)



ex = TabDialog()

One of the errors I see is that you point as the first argument of tab1 to calldisplay that I guess is the widget you want to set but you are passing it as an argument to "argument" which is a string, so a first change is to change it .

On the other hand if you are going to use layouts forget about setGeometry() since now the geometry is handled by the QLayouts.

And finally, your display_elements class is not implemented correctly since the rgroup is not added to the widget and for this you must use a layout.

Considering the above, the solution is the following:

import PySide2.QtCore as QtCore
import PySide2.QtGui as QtGui
import PySide2.QtWidgets as QtGuiWidgets

class TabDialog(QtGuiWidgets.QDialog):
    def __init__(self, parent=None):
        super(TabDialog, self).__init__(parent)
        argument = "Temp"

        calldisplay = display_elements()

        tabWidget = QtGuiWidgets.QTabWidget()
        tabWidget.addTab(tab1(calldisplay), "tab1")
        tabWidget.addTab(tab2(argument), "tab2")

        buttonBox = QtGuiWidgets.QDialogButtonBox(
            QtGuiWidgets.QDialogButtonBox.Ok | QtGuiWidgets.QDialogButtonBox.Cancel)

        buttonBox.accepted.connect(self.accept)
        buttonBox.rejected.connect(self.reject)

        mainLayout = QtGuiWidgets.QVBoxLayout()
        mainLayout.addWidget(tabWidget)
        mainLayout.addWidget(buttonBox)
        self.setLayout(mainLayout)

        self.setWindowTitle("Load All Elements")
        self.show()

class tab1(QtGuiWidgets.QWidget):
    def __init__(self, calldisplay, parent=None):
        super(tab1, self).__init__(parent)

        self.layerfilterGroup = QtGuiWidgets.QLabel("Filter 1")
        self.peopleGroup = QtGuiWidgets.QGroupBox("Filter 2")
        self.dateGroup = QtGuiWidgets.QGroupBox("Filter 3")
        self.loadGroup = QtGuiWidgets.QLabel("Load elements")

        self.filterGroup = QtGuiWidgets.QGroupBox("Filters")
        self.filterGroup.setGeometry(100, 100, 700, 550)
        self.filterLayout = QtGuiWidgets.QVBoxLayout()

        for key in range(15):
            self.btn = QtGuiWidgets.QCheckBox(str(key))
            self.btn.setChecked(True)
            self.filterLayout.addWidget(self.btn)
        self.filterGroup.setLayout(self.filterLayout)

        self.filterscroll = QtGuiWidgets.QScrollArea()
        self.fslayout = QtGuiWidgets.QVBoxLayout()
        self.filterscroll.setWidget(self.filterGroup)
        self.fslayout.addWidget(self.filterscroll)

        self.artist = ["All", "N/A", "N/A", "N/A"]
        self.acombos = QtGuiWidgets.QComboBox()
        self.acombos.addItems(self.artist)

        self.all_label = QtGuiWidgets.QLabel()
        self.all_label.setText('All')
        self.all_label.setGeometry(160, 40, 80, 30)

        self.late_label = QtGuiWidgets.QLabel()
        self.late_label.setText('Latest')
        self.late_label.setGeometry(160, 40, 80, 30)

        self.dslider = QtGuiWidgets.QSlider(QtCore.Qt.Horizontal, self)

        self.artistlayout = QtGuiWidgets.QVBoxLayout()
        self.artistlayout.addWidget(self.acombos)
        self.peopleGroup.setLayout(self.artistlayout)

        self.datelayout = QtGuiWidgets.QHBoxLayout()
        self.datelayout.addWidget(self.all_label)
        self.datelayout.addWidget(self.dslider)
        self.datelayout.addWidget(self.late_label)
        self.dateGroup.setLayout(self.datelayout)

        self.rgroup = QtGuiWidgets.QGroupBox("Elements")
        self.rlayout = QtGuiWidgets.QVBoxLayout()

        self.rlayout.addWidget(calldisplay)
        self.rgroup.setLayout(self.rlayout)

        self.rscroll = QtGuiWidgets.QScrollArea()
        self.rlayout = QtGuiWidgets.QVBoxLayout()
        self.rscroll.setWidget(self.rgroup)
        self.rlayout.addWidget(self.rscroll)

        self.mainLayout = QtGuiWidgets.QVBoxLayout()
        self.mainLayout.addWidget(self.layerfilterGroup)
        self.mainLayout.addWidget(self.filterscroll)
        self.mainLayout.addWidget(self.peopleGroup)
        self.mainLayout.addWidget(self.dateGroup)
        self.mainLayout.addWidget(self.loadGroup)
        self.mainLayout.addWidget(self.rscroll)
        self.setLayout(self.mainLayout)

class display_elements(QtGuiWidgets.QWidget):
    def __init__(self, parent=None):
        super(display_elements, self).__init__(parent)
        self.rgroup = QtGuiWidgets.QGroupBox("Available Elements")
        lay = QtGuiWidgets.QVBoxLayout()
        for key in range(15):
            btn = QtGuiWidgets.QCheckBox(str(key))
            btn.setChecked(True)
            lay.addWidget(btn)
        rlayout = QtGuiWidgets.QVBoxLayout(self)
        rlayout.setContentsMargins(0, 0, 0, 0)
        rlayout.addWidget(self.rgroup)
        self.rgroup.setLayout(lay)

class tab2(QtGuiWidgets.QWidget):
    def __init__(self, fileInfo, parent=None):
        super(tab2, self).__init__(parent)


if __name__ == '__main__':
    import sys
    app = QtGuiWidgets.QApplication(sys.argv)
    ex = TabDialog()
    ex.show()
    sys.exit(app.exec_())

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM