pyqt5:qgridlayout将所有小部件放在左上角

发布于 2025-02-06 08:03:02 字数 3672 浏览 0 评论 0原文

我正在使用pyqt5.qtwidgets.qgridlayout进行网格布局:

self.grid.addWidget(self.combo,0,0,1,2)            self.grid.addWidget(self.label_A,1,0)           self.grid.addWidget(self.input_A, 1, 1)            self.grid.addWidget(self.label_freq, 2, 0)            self.grid.addWidget(self.input_freq, 2, 1)            self.grid.addWidget(self.label_phase, 3, 0)            self.grid.addWidget(self.input_phase, 3, 1)

它无法正常工作,当我使用它进行调试时:

            for i in range(self.grid.count()):
                print(self.grid.itemAt(i).geometry())

返回:

PyQt5.QtCore.QRect(0, 0, 100, 42)
PyQt5.QtCore.QRect(0, 0, 640, 480)
PyQt5.QtCore.QRect(0, 0, 640, 480)
PyQt5.QtCore.QRect(0, 0, 640, 480)
PyQt5.QtCore.QRect(0, 0, 640, 480)
PyQt5.QtCore.QRect(0, 0, 640, 480)
PyQt5.QtCore.QRect(0, 0, 640, 480)

qgridlayout将所有小部件都放在顶部的角落。我应该怎么办?

我的PYQT5版本是5.15.6。 感谢您的建议。 原始代码如下:


class SubWindow(PyQt5.QtWidgets.QWidget):
    def __init__(self):
        super().__init__()

        self.setWindowTitle('sub')

        self.prop=dict[str,float]()
        self.prop = {'sig_type': 'sin',
                     'A': 1,
                     'freq': 1,
                     'phase': 0}

        combo=PyQt5.QtWidgets.QComboBox()
        combo.addItems(['sin','tri','rect','imp','step','exp'])
        combo.currentIndexChanged.connect(self.update)
        combo.currentIndexChanged.connect(lambda :print(combo.currentIndex()))
        combo.adjustSize()
        self.combo=combo

        ax=MplCanvas(self)
        self.ax=ax

        self.grid:PyQt5.QtWidgets.QGridLayout = PyQt5.QtWidgets.QGridLayout()
        self.grid.addWidget(self.combo,0,0)
        self.setLayout(self.grid)

        self.update()

    def show(self) -> None:
        super(SubWindow, self).show()
        self.update()

    def update(self) -> None:
        self.grid:PyQt5.QtWidgets.QGridLayout=PyQt5.QtWidgets.QGridLayout()

        if self.combo.currentIndex()==0:
            A=self.prop['A']
            freq=self.prop['freq']
            phase=self.prop['phase']
            x=np.linspace(0,2*np.pi,100)
            self.ax.axes.plot(x,np.sin(x))

            self.grid.addWidget(self.combo,0,0,1,2)

            self.label_A=PyQt5.QtWidgets.QLabel('A')
            self.input_A=PyQt5.QtWidgets.QLineEdit()
            self.input_A.editingFinished.connect(self.update)
            self.input_A.editingFinished.connect(lambda s:self.prop.__setitem__('A',float(s)))

            self.label_freq = PyQt5.QtWidgets.QLabel('freq')
            self.input_freq = PyQt5.QtWidgets.QLineEdit('freq')
            self.input_freq.editingFinished.connect(self.update)
            self.input_A.textEdited.connect(lambda s: self.prop.__setitem__('freq', float(s)))

            self.label_phase = PyQt5.QtWidgets.QLabel('phase')
            self.input_phase = PyQt5.QtWidgets.QLineEdit('phase')
            self.input_phase.editingFinished.connect(self.update)
            self.input_A.editingFinished.connect(lambda s: self.prop.__setitem__('phase', float(s)))

            self.grid.addWidget(self.label_A,1,0)
            self.grid.addWidget(self.input_A, 1, 1)
            self.grid.addWidget(self.label_freq, 2, 0)
            self.grid.addWidget(self.input_freq, 2, 1)
            self.grid.addWidget(self.label_phase, 3, 0)
            self.grid.addWidget(self.input_phase, 3, 1)

            for i in range(self.grid.count()):
                print(self.grid.itemAt(i).geometry())
            

I was making grid layout with PyQt5.QtWidgets.QGridLayout:

self.grid.addWidget(self.combo,0,0,1,2)            self.grid.addWidget(self.label_A,1,0)           self.grid.addWidget(self.input_A, 1, 1)            self.grid.addWidget(self.label_freq, 2, 0)            self.grid.addWidget(self.input_freq, 2, 1)            self.grid.addWidget(self.label_phase, 3, 0)            self.grid.addWidget(self.input_phase, 3, 1)

it did not work properly and when i use this to debug:

            for i in range(self.grid.count()):
                print(self.grid.itemAt(i).geometry())

it returns:

PyQt5.QtCore.QRect(0, 0, 100, 42)
PyQt5.QtCore.QRect(0, 0, 640, 480)
PyQt5.QtCore.QRect(0, 0, 640, 480)
PyQt5.QtCore.QRect(0, 0, 640, 480)
PyQt5.QtCore.QRect(0, 0, 640, 480)
PyQt5.QtCore.QRect(0, 0, 640, 480)
PyQt5.QtCore.QRect(0, 0, 640, 480)

The QGridLayout place all my widgets in the top-left corner. What should i do?

My PyQt5 version is 5.15.6.
Thanks for any advice.
The original code are as follow:


class SubWindow(PyQt5.QtWidgets.QWidget):
    def __init__(self):
        super().__init__()

        self.setWindowTitle('sub')

        self.prop=dict[str,float]()
        self.prop = {'sig_type': 'sin',
                     'A': 1,
                     'freq': 1,
                     'phase': 0}

        combo=PyQt5.QtWidgets.QComboBox()
        combo.addItems(['sin','tri','rect','imp','step','exp'])
        combo.currentIndexChanged.connect(self.update)
        combo.currentIndexChanged.connect(lambda :print(combo.currentIndex()))
        combo.adjustSize()
        self.combo=combo

        ax=MplCanvas(self)
        self.ax=ax

        self.grid:PyQt5.QtWidgets.QGridLayout = PyQt5.QtWidgets.QGridLayout()
        self.grid.addWidget(self.combo,0,0)
        self.setLayout(self.grid)

        self.update()

    def show(self) -> None:
        super(SubWindow, self).show()
        self.update()

    def update(self) -> None:
        self.grid:PyQt5.QtWidgets.QGridLayout=PyQt5.QtWidgets.QGridLayout()

        if self.combo.currentIndex()==0:
            A=self.prop['A']
            freq=self.prop['freq']
            phase=self.prop['phase']
            x=np.linspace(0,2*np.pi,100)
            self.ax.axes.plot(x,np.sin(x))

            self.grid.addWidget(self.combo,0,0,1,2)

            self.label_A=PyQt5.QtWidgets.QLabel('A')
            self.input_A=PyQt5.QtWidgets.QLineEdit()
            self.input_A.editingFinished.connect(self.update)
            self.input_A.editingFinished.connect(lambda s:self.prop.__setitem__('A',float(s)))

            self.label_freq = PyQt5.QtWidgets.QLabel('freq')
            self.input_freq = PyQt5.QtWidgets.QLineEdit('freq')
            self.input_freq.editingFinished.connect(self.update)
            self.input_A.textEdited.connect(lambda s: self.prop.__setitem__('freq', float(s)))

            self.label_phase = PyQt5.QtWidgets.QLabel('phase')
            self.input_phase = PyQt5.QtWidgets.QLineEdit('phase')
            self.input_phase.editingFinished.connect(self.update)
            self.input_A.editingFinished.connect(lambda s: self.prop.__setitem__('phase', float(s)))

            self.grid.addWidget(self.label_A,1,0)
            self.grid.addWidget(self.input_A, 1, 1)
            self.grid.addWidget(self.label_freq, 2, 0)
            self.grid.addWidget(self.input_freq, 2, 1)
            self.grid.addWidget(self.label_phase, 3, 0)
            self.grid.addWidget(self.input_phase, 3, 1)

            for i in range(self.grid.count()):
                print(self.grid.itemAt(i).geometry())
            

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文