首页 > 解决方案 > Pyside-从另一个类添加小部件

问题描述

我正在尝试使用 PySide 构建布局,我遇到了一种情况,我想将一个小部件组保留在一个单独的类中并动态调用它。我查看了这个网站上的几个例子,这给了我一个想法,但我仍然无法自己解决这个问题。这是我正在构建的布局的示例代码,如果有人可以帮助我解决这个问题,这将非常有帮助。-提前致谢

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

标签: pythonpyside2

解决方案


我看到的一个错误是,您将 tab1 的第一个参数指向 calldisplay,我猜这是您要设置的小部件,但是您将它作为参数传递给“argument”,它是一个字符串,所以第一个更改是改变它。

另一方面,如果您要使用布局,请忘记 setGeometry(),因为现在几何由 QLayouts 处理。

最后,您的 display_elements 类未正确实现,因为 rgroup 未添加到小部件中,为此您必须使用布局。

考虑到上述情况,解决方案如下:

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

推荐阅读