簡體   English   中英

如何修改QGroupBox的QLayout以刪除或添加參數QTextEdit輸入? (Python,PyQt)

[英]How do I modify a QLayout of a QGroupBox to remove or add parameter QTextEdit input? (Python, PyQt)

我正在嘗試實現一個能夠從用戶獲取參數的窗口。 在此窗口中,用戶應給出多行(具有N個參數集)。 從這個數字,我想為每個N參數集自動生成QTextEdit集。 所以從現在開始我有這段代碼

# -*- coding: utf-8 -*-
from __future__ import absolute_import
from __future__ import division
from __future__ import print_function
from __future__ import unicode_literals

from PyQt4 import QtGui
import sys
import numpy as np

class SurfViewer(QtGui.QMainWindow):
    def __init__(self, parent=None):
        super(SurfViewer, self).__init__()

        # General Window
        self.centralWidget = QtGui.QWidget()
        self.setCentralWidget(self.centralWidget)
        self.mainHBOX_param_scene = QtGui.QVBoxLayout()

        # parameter2
        self.horizontalGroupBox_Param2 = QtGui.QGroupBox("Set range Parameter 2 for matrix method")
        self.horizontalGroupBox_Param2.setMaximumHeight(80)
        self.Param2_layout = QtGui.QVBoxLayout()
        grid2 = QtGui.QGridLayout()
        self.Param2_layout.addLayout(grid2)
        self.Param2_Label = QtGui.QLabel('Name')
        self.Param2 = QtGui.QComboBox()
        self.Param2.addItems(["a","b","c"])
        self.Param2.setMinimumWidth(100)
        # self.Param2_layout.addWidget(self.Param2)
        self.Param2_min_Label = QtGui.QLabel('min')
        self.Param2_min_Edit = QtGui.QTextEdit('1')
        self.Param2_min_Edit.setMaximumWidth(40)
        self.Param2_max_Label = QtGui.QLabel('max')
        self.Param2_max_Edit = QtGui.QTextEdit('5')
        self.Param2_max_Edit.setMaximumWidth(40)
        self.Param2_step_Label = QtGui.QLabel('step')
        self.Param2_step_Edit = QtGui.QTextEdit('1')
        self.Param2_step_Edit.setMaximumWidth(40)
        grid2.addWidget(self.Param2_Label, 0, 0)
        grid2.addWidget(self.Param2, 1, 0)
        grid2.addWidget(self.Param2_min_Label, 0, 1)
        grid2.addWidget(self.Param2_min_Edit, 1, 1)
        grid2.addWidget(self.Param2_max_Label, 0, 2)
        grid2.addWidget(self.Param2_max_Edit, 1, 2)
        grid2.addWidget(self.Param2_step_Label, 0, 3)
        grid2.addWidget(self.Param2_step_Edit, 1, 3)
        self.horizontalGroupBox_Param2.setLayout(self.Param2_layout)

          #action button
        self.horizontalGroupBox_Actions = QtGui.QGroupBox("Actions")
        self.horizontalGroupBox_Actions.setMaximumHeight(100)
        self.layout_Actions = QtGui.QHBoxLayout()
        self.Button_Run=QtGui.QPushButton('Run')
        self.nbparam = QtGui.QTextEdit('2')
        self.nbparam.setMaximumHeight(30)
        self.nbparam.setMaximumWidth(50)
        self.layout_Actions.addWidget(self.Button_Run)
        self.layout_Actions.addWidget(self.nbparam)
        self.horizontalGroupBox_Actions.setLayout(self.layout_Actions)

        # set layout

        self.mainHBOX_param_scene.addWidget(self.horizontalGroupBox_Actions)
        self.mainHBOX_param_scene.addWidget(self.horizontalGroupBox_Param2)
        self.centralWidget.setLayout(self.mainHBOX_param_scene)

        self.Button_Run.clicked.connect(self.Runclick)

    def Runclick(self):

         # parameter2
        self.horizontalGroupBox_Param = QtGui.QGroupBox("Set range Parameter 2 for matrix method")
        nbparam = int(self.nbparam.toPlainText())
        self.Param_layout = QtGui.QVBoxLayout()
        grid2 = QtGui.QGridLayout()
        self.Param_layout.addLayout(grid2)
        self.Param_Label = QtGui.QLabel('Names')
        self.Param_min_Label = QtGui.QLabel('mins')
        self.Param_max_Label = QtGui.QLabel('maxs')
        self.Param_step_Label = QtGui.QLabel('steps')
        grid2.addWidget(self.Param_Label, 0, 0)
        grid2.addWidget(self.Param_min_Label, 0, 1)
        grid2.addWidget(self.Param_max_Label, 0, 2)
        grid2.addWidget(self.Param_step_Label, 0, 3)

        self.listofedit = []
        text=["a","b","c"]
        for i in np.arange(nbparam):
            print(i)
            self.listofedit.append([QtGui.QComboBox(),QtGui.QTextEdit('10'),QtGui.QTextEdit('50'),QtGui.QTextEdit('10')])
            self.listofedit[i][0].addItems(text)
            self.listofedit[i][0].setMinimumWidth(100)
            self.listofedit[i][1].setMaximumWidth(40)
            self.listofedit[i][2].setMaximumWidth(40)
            self.listofedit[i][3].setMaximumWidth(40)
            grid2.addWidget(self.listofedit[i][0], i+1, 0)
            grid2.addWidget(self.listofedit[i][1], i+1, 1)
            grid2.addWidget(self.listofedit[i][2], i+1, 2)
            grid2.addWidget(self.listofedit[i][3], i+1, 3)

        self.horizontalGroupBox_Param.setLayout(self.Param_layout)
        # while self.horizontalGroupBox_Param2.layout().count():
        #     self.horizontalGroupBox_Param2.layout().itemAt(0).widget().deleteLater()
        self.horizontalGroupBox_Param2.layout().clear()
        self.horizontalGroupBox_Param2.setLayout(self.Param_layout)
        return

if __name__ == '__main__':
    app = QtGui.QApplication(sys.argv)
    ex = SurfViewer(app)
    ex.show()
    sys.exit(app.exec_())

這使我產生這個窗口:

在此處輸入圖片說明

因此,我想單擊的是“運行”(右上角的數字為N行),然后修改窗口下部的參數集數量。 因此,在這種情況下,我應該有兩行輸入兩個名稱,兩個最小,兩個最大和兩個階躍值。 我開始進行窗口更新,但是我一直在努力尋找正確的代碼以放入def Runclick(self):

我已經編寫了代碼以生成正確數量的參數集行,但是我無法使用它們來更新窗口。

我清楚地做了最后一部分寫的東西:

self.horizontalGroupBox_Param.setLayout(self.Param_layout)
# while self.horizontalGroupBox_Param2.layout().count():
# self.horizontalGroupBox_Param2.layout().itemAt(0).widget().deleteLater() 
self.horizontalGroupBox_Param2.setLayout(self.Param_layout)

我認為我沒有采取正確的方法。 因此,如果有人對此有解決方案,我將不勝感激

更新

嗨,@ jgorosdev,謝謝您的回答。 雖然,它與我想要的不完全對應。 在您給我的代碼中,它可以正常工作,因為參數集始終在窗口底部更新,但是在我更高級的軟件中,后面還有一些其他QGroupBox。 例如,如果我添加一個類似控制台的部分:

 # -*- coding: utf-8 -*-
from __future__ import absolute_import
from __future__ import division
from __future__ import print_function
from __future__ import unicode_literals

from PyQt4 import QtGui

import sys
import numpy as np

class SurfViewer(QtGui.QMainWindow):
    def __init__(self, parent=None):
        super(SurfViewer, self).__init__()

        # General Window
        self.centralWidget = QtGui.QWidget()
        self.setCentralWidget(self.centralWidget)
        self.mainHBOX_param_scene = QtGui.QVBoxLayout()

        #action button
        self.horizontalGroupBox_Actions = QtGui.QGroupBox("Actions")
        self.horizontalGroupBox_Actions.setMaximumHeight(100)
        self.layout_Actions = QtGui.QHBoxLayout()
        self.Button_Run=QtGui.QPushButton('Run')
        self.nbparam = QtGui.QTextEdit('3')
        self.nbparam.setMaximumHeight(30)
        self.nbparam.setMaximumWidth(50)
        self.layout_Actions.addWidget(self.Button_Run)
        self.layout_Actions.addWidget(self.nbparam)
        self.horizontalGroupBox_Actions.setLayout(self.layout_Actions)

        self.mainHBOX_param_scene.addWidget(self.horizontalGroupBox_Actions)
        self.centralWidget.setLayout(self.mainHBOX_param_scene)
        self.updateWidget = None

        # Param2 layout
        self.horizontalGroupBox_Param2 = QtGui.QGroupBox("Set range Parameter 2 for matrix method")
        self.Param2_layout = QtGui.QVBoxLayout()
        self.Button_Run.clicked.connect(self.UpdateLayout)
        self.UpdateLayout()

        # console
        self.horizontalGroupBox_Console2 = QtGui.QGroupBox("Console ")
        self.layout_Consol_Label2 = QtGui.QVBoxLayout()
        self.Consol_Label2 = QtGui.QTextEdit('Console :')
        self.layout_Consol_Label2.addWidget(self.Consol_Label2)
        self.horizontalGroupBox_Console2.setLayout(self.layout_Consol_Label2)
        self.mainHBOX_param_scene.addWidget(self.horizontalGroupBox_Console2)

        # parameter2
        # From now on everything well be created inside a function that updates the layout
    def UpdateLayout(self):
        if (self.updateWidget == None):
            self.updateWidget = QtGui.QWidget()
        else:
            self.mainHBOX_param_scene.removeWidget(self.updateWidget)
            self.updateWidget.deleteLater()
            self.updateWidget = None

        cnt =  self.mainHBOX_param_scene.layout().count()
        print("Widget count:" +str(cnt)+ "")
        nbparam = int(self.nbparam.toPlainText())
        #self.horizontalGroupBox_Param2.setMaximumHeight(150)
        grid2 = QtGui.QGridLayout()
        self.Param2_Label = QtGui.QLabel('Name')
        self.Param2 = QtGui.QComboBox()
        self.Param2.addItems(["a","b","c"])
        self.Param2.setMinimumWidth(100)


        # self.Param2_layout.addWidget(self.Param2)
        self.Param2_min_Label = QtGui.QLabel('min')
        self.Param2_max_Label = QtGui.QLabel('max')
        self.Param2_step_Label = QtGui.QLabel('step')

        grid2.addWidget(self.Param2_Label, 0, 0)
        grid2.addWidget(self.Param2_min_Label, 0, 1)
        grid2.addWidget(self.Param2_max_Label, 0, 2)
        grid2.addWidget(self.Param2_step_Label, 0, 3)

        self.listofedit = []
        text=["a","b","c"]
        for i in np.arange(nbparam):
            print(i)
            self.listofedit.append([QtGui.QComboBox(),QtGui.QTextEdit('20'),QtGui.QTextEdit('50'),QtGui.QTextEdit('10')])
            self.listofedit[i][0].addItems(text)
            self.listofedit[i][0].setMinimumWidth(100)
            self.listofedit[i][1].setMaximumWidth(40)
            self.listofedit[i][1].setMaximumHeight(40)
            self.listofedit[i][2].setMaximumWidth(40)
            self.listofedit[i][2].setMaximumHeight(40)
            self.listofedit[i][3].setMaximumWidth(40)
            self.listofedit[i][3].setMaximumHeight(40)
            grid2.addWidget(self.listofedit[i][0], i+1, 0)
            grid2.addWidget(self.listofedit[i][1], i+1, 1)
            grid2.addWidget(self.listofedit[i][2], i+1, 2)
            grid2.addWidget(self.listofedit[i][3], i+1, 3)

        self.updateWidget = QtGui.QWidget()
        self.updateWidget.setLayout(grid2)
        #self.updateWidget.setMaximumHeight(nbparam*60)
        self.Param2_layout.addWidget(self.updateWidget)
        self.horizontalGroupBox_Param2.setLayout(self.Param2_layout)
        self.mainHBOX_param_scene.addWidget(self.horizontalGroupBox_Param2)
        return

if __name__ == '__main__':
    app = QtGui.QApplication(sys.argv)
    ex = SurfViewer(app)
    ex.show()
    sys.exit(app.exec_())

我一開始有這個窗口:

在此處輸入圖片說明

這是我想要的,但是單擊“運行”按鈕后,我得到了這張圖片:

在此處輸入圖片說明

因此,控制台和參數集是相反的。 我想知道是否可以在不重新構建所有布局的情況下替換部分布局?

我對代碼做了一些小的更改,現在可以正常工作了。

您在代碼中兩次創建了底部的groupbox,我認為這是一種更好的方法。 我已經將所有內容打包在UpdateLayout函數中。

您可能需要重新檢查大小調整qt策略,以正確調整主窗口的大小。

帶有UPDATE的代碼:

 # -*- coding: utf-8 -*-
from __future__ import absolute_import
from __future__ import division
from __future__ import print_function
from __future__ import unicode_literals

from PyQt4 import QtGui

import sys
import numpy as np

class SurfViewer(QtGui.QMainWindow):
    def __init__(self, parent=None):
        super(SurfViewer, self).__init__()

        # General Window
        self.centralWidget = QtGui.QWidget()
        self.setCentralWidget(self.centralWidget)
        self.mainHBOX_param_scene = QtGui.QVBoxLayout()

        #action button
        self.horizontalGroupBox_Actions = QtGui.QGroupBox("Actions")
        self.horizontalGroupBox_Actions.setMaximumHeight(100)
        self.layout_Actions = QtGui.QHBoxLayout()
        self.Button_Run=QtGui.QPushButton('Run')
        self.nbparam = QtGui.QTextEdit('3')
        self.nbparam.setMaximumHeight(30)
        self.nbparam.setMaximumWidth(50)
        self.layout_Actions.addWidget(self.Button_Run)
        self.layout_Actions.addWidget(self.nbparam)
        self.horizontalGroupBox_Actions.setLayout(self.layout_Actions)

        self.mainHBOX_param_scene.addWidget(self.horizontalGroupBox_Actions)
        self.centralWidget.setLayout(self.mainHBOX_param_scene)
        self.updateWidget = None

        # Param2 layout
        self.horizontalGroupBox_Param2 = QtGui.QGroupBox("Set range Parameter 2 for matrix method")
        self.Param2_layout = QtGui.QVBoxLayout()
        self.Button_Run.clicked.connect(self.UpdateLayout)
        self.UpdateLayout()

        # console
        self.horizontalGroupBox_Console2 = QtGui.QGroupBox("Console ")
        self.layout_Consol_Label2 = QtGui.QVBoxLayout()
        self.Consol_Label2 = QtGui.QTextEdit('Console :')
        self.layout_Consol_Label2.addWidget(self.Consol_Label2)
        self.horizontalGroupBox_Console2.setLayout(self.layout_Consol_Label2)
        self.mainHBOX_param_scene.addWidget(self.horizontalGroupBox_Console2)

        # parameter2
        # From now on everything well be created inside a function that updates the layout
    def UpdateLayout(self):
        if (self.updateWidget == None):
            self.updateWidget = QtGui.QWidget()
        else:
            self.mainHBOX_param_scene.removeWidget(self.updateWidget)
            self.updateWidget.deleteLater()
            self.updateWidget = None

        cnt =  self.mainHBOX_param_scene.layout().count()
        print("Widget count:" +str(cnt)+ "")
        nbparam = int(self.nbparam.toPlainText())
        #self.horizontalGroupBox_Param2.setMaximumHeight(150)
        grid2 = QtGui.QGridLayout()
        self.Param2_Label = QtGui.QLabel('Name')
        self.Param2 = QtGui.QComboBox()
        self.Param2.addItems(["a","b","c"])
        self.Param2.setMinimumWidth(100)


        # self.Param2_layout.addWidget(self.Param2)
        self.Param2_min_Label = QtGui.QLabel('min')
        self.Param2_max_Label = QtGui.QLabel('max')
        self.Param2_step_Label = QtGui.QLabel('step')

        grid2.addWidget(self.Param2_Label, 0, 0)
        grid2.addWidget(self.Param2_min_Label, 0, 1)
        grid2.addWidget(self.Param2_max_Label, 0, 2)
        grid2.addWidget(self.Param2_step_Label, 0, 3)

        self.listofedit = []
        text=["a","b","c"]
        for i in np.arange(nbparam):
            print(i)
            self.listofedit.append([QtGui.QComboBox(),QtGui.QTextEdit('20'),QtGui.QTextEdit('50'),QtGui.QTextEdit('10')])
            self.listofedit[i][0].addItems(text)
            self.listofedit[i][0].setMinimumWidth(100)
            self.listofedit[i][1].setMaximumWidth(40)
            self.listofedit[i][1].setMaximumHeight(40)
            self.listofedit[i][2].setMaximumWidth(40)
            self.listofedit[i][2].setMaximumHeight(40)
            self.listofedit[i][3].setMaximumWidth(40)
            self.listofedit[i][3].setMaximumHeight(40)
            grid2.addWidget(self.listofedit[i][0], i+1, 0)
            grid2.addWidget(self.listofedit[i][1], i+1, 1)
            grid2.addWidget(self.listofedit[i][2], i+1, 2)
            grid2.addWidget(self.listofedit[i][3], i+1, 3)

        self.updateWidget = QtGui.QWidget()
        self.updateWidget.setLayout(grid2)
        #self.updateWidget.setMaximumHeight(nbparam*60)
        self.Param2_layout.addWidget(self.updateWidget,)
        self.horizontalGroupBox_Param2.setLayout(self.Param2_layout)
        #self.mainHBOX_param_scene.addWidget(self.horizontalGroupBox_Param2)
        # NEW
        self.mainHBOX_param_scene.insertWidget(1,self.horizontalGroupBox_Param2)

        return

if __name__ == '__main__':
    app = QtGui.QApplication(sys.argv)
    ex = SurfViewer(app)
    ex.show()
    sys.exit(app.exec_())

回答更新

如果您願意在不更改位置的情況下更新 QGroupBox,則您需要的功能不是addWidget() ,而是insertWidget()函數。

我已經更新了添加小部件的UpdateLayout函數中的行。 希望適合您。

接下來是該函數的參考:

http://doc.qt.io/qt-4.8/qboxlayout.html#insertWidget

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM