簡體   English   中英

PyQt:removeChild / addChild QGroupBox

[英]PyQt: removeChild/addChild QGroupBox

我正在為一個客戶開發一個系統,該系統顯示在一組選項卡中,並在centralwidget中顯示一個表,其中包含從數據庫中提取的數據。

根據鼠標事件,必須從centralwidget中刪除容器(groupBox),或者隨后為表添加新的更新數據。

下面是一段運行良好的代碼,並在GroupBox中顯示包含數據的表:

    self.tab_tableview = QtGui.QWidget()
    self.tab_tableview.setObjectName("tab_tableview")

    self.viewGroupBox = QtGui.QGroupBox(self.tab_tableview)
    self.viewGroupBox.setGeometry(QtCore.QRect(10, 0, 751, 501))
    self.viewGroupBox.setObjectName("viewGroupBox")

    self.vBox = QtGui.QVBoxLayout()
    self.vBox.addWidget(self.newGroupBox)
    self.vBox.setGeometry(QtCore.QRect(40, 170, 171, 111))
    self.vBox.addStretch(1)

    self.viewTableWidget = QtGui.QTableView(self.viewGroupBox)
    self.viewTableWidget.setGeometry(QtCore.QRect(10, 20, 731, 471))
    self.viewTableWidget.setObjectName("viewTableWidget")

    updatedTableModel=self.callShowTable() 
    self.viewTableWidget.setModel(updatedTableModel)

    self.viewTableWidget.setColumnWidth(0,30)
    self.viewTableWidget.setColumnWidth(1,550)

    self.viewTabWidget.addTab(self.tab_tableview, "")

    if removeContainer_Bottun_Pressed:
        print "remove bottun was pressed"
        self.vBox.removeWidget(self.viewGroupBox)

    if addContainer_Bottun_Pressed:
        print "add bottun was pressed"
        self.vBox.addWidget(self.viewGroupBox)

程序檢測到“removeContainer_Bottun_Pressed”為true,並運行removeWidget(self.newGroupBox)。 雖然removeWidget運行,但groupBox保持在同一位置,而不是消失並在請求時重新出現。

這里缺少什么?

所有意見和建議都非常感謝。

我不認為調用removeWidget是必要的。 嘗試在您要刪除的任何內容上調用widget.deleteLater。 然后,當您想要將其添加回來時,重新創建它並使用layout.insertWidget將其放置在適當的位置。 那樣有用嗎?

它在Windows XP上為我工作...

import sys

from PyQt4 import QtGui, QtCore

app = QtGui.QApplication(sys.argv)

widget = QtGui.QWidget()
widget_layout = QtGui.QHBoxLayout()
widget.setLayout(widget_layout)

def add_group_box():
    group_box = widget.group_box = QtGui.QGroupBox()
    group_layout = QtGui.QVBoxLayout()
    group_box.setLayout(group_layout)

    for i in range(2):
        group_layout.addWidget(QtGui.QRadioButton(str(i)))

    widget_layout.insertWidget(0, group_box)
add_group_box()

show_button = QtGui.QPushButton("show")
hide_button = QtGui.QPushButton("hide")
def on_show():
    if not widget.group_box:
        add_group_box()
def on_hide():
    if widget.group_box:
        widget.group_box.deleteLater()
        widget.group_box = None
show_button.connect(show_button, QtCore.SIGNAL("clicked()"), on_show)
hide_button.connect(hide_button, QtCore.SIGNAL("clicked()"), on_hide)    
widget_layout.addWidget(show_button)
widget_layout.addWidget(hide_button)

widget.show()

app.exec_()
  1. 它似乎包含一個拼寫錯誤:addContainer_Bottun_Pressed

    那豈不是Øn_Pressed被addContainer_Bott呢?

  2. 在動態更改小部件后,您可能需要調用某種“重新布局”方法。 您應該在刪除/添加子窗口小部件后嘗試調用它: self.vBox.adjustSize()

首先感謝我在這里收到的所有意見。 順序是源代碼工作 - 或至少完美地工作80%。

  • 80% - 它的作用:radioButton刪除groupBox; radioButton說你好; radioButton說尼斯;

  • 20% - 它還沒有做什么:radioButton添加groupBox。

正如您在序列中看到的那樣,函數addBox被調用,但它第二次運行時不會添加groupBox。

這是進口:

#//===========================================================//#
import os
import platform
import sys
from PyQt4 import QtGui, QtCore
from PyQt4.QtCore import *
from PyQt4.QtGui import *
from PyQt4 import QtCore, QtGui
#//===========================================================//#

這是Ui_Addwidget類..

#//===========================================================//#  
class Ui_Addwidget(object):
    def runbutton3(self):
        print "hello // radioButton3.isChecked : ", self.radioButton3.isChecked()
    def runButton4(self):
        print "nice // radioButton4.isChecked : ", self.radioButton4.isChecked() 
    def addBox(self):
        self.vLayout_wdg = QtGui.QWidget(self.centralwidget)
        self.vLayout_wdg.setGeometry(QtCore.QRect(40, 160, 171, 121))
        self.vLayout_wdg.setObjectName("vLayout_wdg")

        self.vLayoutBoxObj = QtGui.QHBoxLayout()
        self.vLayout_wdg.setLayout(self.vLayoutBoxObj)

        self.newGroupBox = self.vLayout_wdg.newGroupBox = QtGui.QGroupBox(self.vLayout_wdg)
        self.newGroupBox.setObjectName("newGroupBox")
        self.newGroupBox.setTitle(QtGui.QApplication.translate("MainWindow", "newGroupBox", None, QtGui.QApplication.UnicodeUTF8))

        self.groupLayoutBox = QtGui.QVBoxLayout()
        self.groupLayoutBox.setObjectName("groupLayoutBox")
        self.newGroupBox.setLayout(self.groupLayoutBox)

        self.radioButton3 = QtGui.QRadioButton()
        self.radioButton3.setGeometry(QtCore.QRect(30, 30, 101, 21))
        self.radioButton3.setObjectName("helloRadioButton")
        self.radioButton3.setText(QtGui.QApplication.translate("MainWindow", "say: Hello", None, QtGui.QApplication.UnicodeUTF8))

        self.radioButton4 = QtGui.QRadioButton()
        self.radioButton4.setGeometry(QtCore.QRect(30, 60, 111, 18))
        self.radioButton4.setObjectName("niceRadioButton")
        self.radioButton4.setText(QtGui.QApplication.translate("MainWindow", "say: Nice", None, QtGui.QApplication.UnicodeUTF8))

        self.groupLayoutBox.addWidget(self.radioButton3)
        self.groupLayoutBox.addWidget(self.radioButton4)

        self.vLayoutBoxObj.insertWidget(0, self.newGroupBox)
    def on_show(self):
        print "addBox // radioButton1.isChecked : ", self.radioButton1.isChecked()
        if not self.vLayout_wdg.newGroupBox:
            self.addBox()
    def on_hide(self):
        print "deleteBox // radioButton2.isChecked : ", self.radioButton2.isChecked()
        if self.vLayout_wdg.newGroupBox:
            self.vLayout_wdg.newGroupBox.deleteLater()
            self.vLayout_wdg.newGroupBox = None
    def connectEvent(self):
        QtCore.QObject.connect(self.radioButton1, QtCore.SIGNAL("toggled(bool)"),self.on_show)
        QtCore.QObject.connect(self.radioButton2, QtCore.SIGNAL("toggled(bool)"),self.on_hide)
        QtCore.QObject.connect(self.radioButton3, QtCore.SIGNAL("toggled(bool)"),self.runbutton3)
        QtCore.QObject.connect(self.radioButton4, QtCore.SIGNAL("toggled(bool)"),self.runButton4)
    def selectBox(self):
        self.selectGroupBox = QtGui.QGroupBox(self.centralwidget)
        self.selectGroupBox.setGeometry(QtCore.QRect(40, 20, 171, 111))
        self.selectGroupBox.setObjectName("selectGroupBox")
        self.selectGroupBox.setTitle(QtGui.QApplication.translate("MainWindow", "select", None, QtGui.QApplication.UnicodeUTF8))

        self.radioButton1 = QtGui.QRadioButton(self.selectGroupBox)
        self.radioButton1.setGeometry(QtCore.QRect(30, 30, 111, 18))
        self.radioButton1.setObjectName("radioButton1")
        self.radioButton1.setText(QtGui.QApplication.translate("MainWindow", "add groupbox", None, QtGui.QApplication.UnicodeUTF8))

        self.radioButton2 = QtGui.QRadioButton(self.selectGroupBox)
        self.radioButton2.setGeometry(QtCore.QRect(30, 60, 111, 18))
        self.radioButton2.setObjectName("radioButton2")
        self.radioButton2.setText(QtGui.QApplication.translate("MainWindow", "delete groupbox", None, QtGui.QApplication.UnicodeUTF8))  
    def addwidget_centralwdg(self,MainWindow):
        self.centralwidget = QtGui.QWidget(MainWindow)
        self.centralwidget.setObjectName("centralwidget")

        self.selectBox()
        self.addBox()
        self.connectEvent()

        MainWindow.setCentralWidget(self.centralwidget)
    def addwidget_setupUi(self, MainWindow):
        MainWindow.setObjectName("MainWindow")
        MainWindow.resize(250, 300)
        self.addwidget_centralwdg(MainWindow)
        QtCore.QMetaObject.connectSlotsByName(MainWindow)
#//===========================================================//#  

在這里你有mainDesign類......

#//===========================================================//#
class mainDesign(QtGui.QMainWindow,Ui_Addwidget):
    def __init__(self,parent=None):
        super(mainDesign,self).__init__(parent)
        self.addwidget_setupUi(self)
#//===========================================================//#  

當然,def主...

#//===========================================================//#        
def main():
    app = QtGui.QApplication(sys.argv)
    main = mainDesign()
    main.show()
    sys.exit(app.exec_())
main()
#//===========================================================//#

要嘗試它,只需將代碼和類復制到* .py文件。 它會運行。

任何其他意見或建議,以解決難題的缺失部分,非常歡迎和贊賞。

這是最終解決方案,100%工作:

  • 更新如下:

     def on_show(self): print "addBox // radioButton1.isChecked : ", self.radioButton1.isChecked() if not self.centralwidget.newGroupBox: #self.addBox() self.addwidget_centralwdg(self.globalMainWindow) def addwidget_centralwdg(self,MainWindow): self.centralwidget = QtGui.QWidget(MainWindow) self.globalMainWindow=MainWindow self.centralwidget.setObjectName("centralwidget") self.selectBox() self.addBox() self.connectEvent() MainWindow.setCentralWidget(self.centralwidget) 

希望這也可以幫助別人。

暫無
暫無

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

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