pyside - 如何从 gridLayout 中删除小部件

2023-12-07

我在 QT Designer 中构建了一个 ui,然后使用 pyside-uic 将其转换为 python 文件,然后编写了一些代码以编程方式对其进行编辑。换句话说,我有一个按钮Add Row单击时会将其自身重命名为Remove1并创建另一个按钮并将其命名为Add Row并将其添加到布局中。

点击时的代码Add Row,更改名称和信号/槽:

self.pb_Row[-1].setText('Remove'+str(self.nRows))
self.pb_Row[-1].clicked.disconnect( self.addRow )
self.pb_Row[-1].clicked.connect( self.removeRow )

点击时的代码Remove,删除选定的按钮:

iRow = int(self.sender().objectName().split('_')[-1])-1
ind = self.PropertyLayout.indexOf(self.pb_Row[iRow])
t = self.PropertyLayout.takeAt(ind)
t.widget().deleteLater()
# self.pb_Row[iRow].hide()
# self.pb_Row[iRow].deleteLater()
self.pb_Row.pop(iRow)

这工作得很好,直到你添加至少一个然后将其删除,下一次它就会变得混乱。基本上,当我有两个按钮并删除一个按钮然后尝试添加一个按钮时,它会出现错误。我所说的行为不当是指新按钮最终位于旧按钮之上,有时它出现在下方而不是上方。

另外,如果我使用当前的行,它并不会真正重新组织网格布局中的内容.hide()它的功能。我不太确定应该使用哪个。

Thanks!

以下是产生不良结果的序列:

Fresh start Image 1

After Clicking Add After clicking Add

After clicking remove (all fine so far), then click Add (no visible difference) after remove 1

After clicking Add a second time enter image description here

After clicking Remove2, Remove1 appears from under it enter image description here

“工作”代码示例

import numpy as np
import sys
from PySide import QtCore, QtGui
import matplotlib.pyplot as plt

from ModesInFiber import Ui_fiberModesMainWindow

class Ui_fiberModesMainWindow(object):
    def setupUi(self, fiberModesMainWindow):
        fiberModesMainWindow.setObjectName("fiberModesMainWindow")
        fiberModesMainWindow.resize(653, 597)
        self.centralwidget = QtGui.QWidget(fiberModesMainWindow)
        self.centralwidget.setObjectName("centralwidget")
        self.horizontalLayout_2 = QtGui.QHBoxLayout(self.centralwidget)
        self.horizontalLayout_2.setObjectName("horizontalLayout_2")
        self.MainLayout = QtGui.QGridLayout()
        self.MainLayout.setObjectName("MainLayout")
        self.PropertyLayout = QtGui.QGridLayout()
        self.PropertyLayout.setObjectName("PropertyLayout")
        self.lbl_Name = QtGui.QLabel(self.centralwidget)
        self.lbl_Name.setObjectName("lbl_Name")
        self.PropertyLayout.addWidget(self.lbl_Name, 0, 1, 1, 1)
        self.pb_addRow_1 = QtGui.QPushButton(self.centralwidget)
        self.pb_addRow_1.setObjectName("pb_addRow_1")
        self.PropertyLayout.addWidget(self.pb_addRow_1, 1, 5, 1, 1)
        self.ledit_Name_1 = QtGui.QLineEdit(self.centralwidget)
        self.ledit_Name_1.setObjectName("ledit_Name_1")
        self.PropertyLayout.addWidget(self.ledit_Name_1, 1, 1, 1, 1)
        self.MainLayout.addLayout(self.PropertyLayout, 0, 0, 1, 1)
        spacerItem2 = QtGui.QSpacerItem(20, 40, QtGui.QSizePolicy.Minimum, QtGui.QSizePolicy.Expanding)
        self.MainLayout.addItem(spacerItem2, 1, 0, 1, 1)
        self.horizontalLayout_2.addLayout(self.MainLayout)
        fiberModesMainWindow.setCentralWidget(self.centralwidget)

        self.retranslateUi(fiberModesMainWindow)
        QtCore.QMetaObject.connectSlotsByName(fiberModesMainWindow)
#         fiberModesMainWindow.setTabOrder(self.ledit_Name_1, self.ledit_Width_1)
#         fiberModesMainWindow.setTabOrder(self.ledit_Width_1, self.cmb_RIType_1)
#         fiberModesMainWindow.setTabOrder(self.cmb_RIType_1, self.ledit_RIParam_1)
#         fiberModesMainWindow.setTabOrder(self.ledit_RIParam_1, self.pb_addRow_1)

    def retranslateUi(self, fiberModesMainWindow):
        fiberModesMainWindow.setWindowTitle(QtGui.QApplication.translate("fiberModesMainWindow", "MainWindow", None, QtGui.QApplication.UnicodeUTF8))
        self.lbl_Name.setText(QtGui.QApplication.translate("fiberModesMainWindow", "Name", None, QtGui.QApplication.UnicodeUTF8))
        self.pb_addRow_1.setText(QtGui.QApplication.translate("fiberModesMainWindow", "Add Row", None, QtGui.QApplication.UnicodeUTF8))


class DesignerMainWindow(QtGui.QMainWindow, Ui_fiberModesMainWindow):

    def __init__(self, parent = None):
        super(DesignerMainWindow, self).__init__(parent)
        self.setupUi(self)
        self.pb_addRow_1.clicked.connect( self.addRow )

        self.ledit_Name     = [ self.ledit_Name_1 ]
        self.pb_Row      = [ self.pb_addRow_1 ]

        # number of rows
        self.nRows = 1


    def addRow( self ):

        self.ledit_Name[-1].setEnabled(False)
        self.pb_Row[-1].setText('Remove'+str(self.nRows))
        self.pb_Row[-1].clicked.disconnect( self.addRow )
        self.pb_Row[-1].clicked.connect( self.removeRow )

        self.nRows += 1

        self.ledit_Name.append( QtGui.QLineEdit(self.centralwidget) )
        self.ledit_Name[-1].setObjectName('ledit_Name_'+str(self.nRows))
        self.PropertyLayout.addWidget( self.ledit_Name[-1], self.nRows, 1, 1, 1)

        self.pb_Row.append( QtGui.QPushButton(self.centralwidget) )
        self.pb_Row[-1].setObjectName( 'pb_addRow_'+str(self.nRows) )
        self.pb_Row[-1].setText('Add Row')
        self.pb_Row[-1].clicked.connect( self.addRow )
        self.PropertyLayout.addWidget( self.pb_Row[-1], self.nRows, 5, 1, 1)


    def removeRow( self ):

        iRow = int(self.sender().objectName().split('_')[-1])-1
        self.nRows -= 1

        ind = self.PropertyLayout.indexOf(self.ledit_Name[iRow])
        t = self.PropertyLayout.takeAt(ind)
        t.widget().setParent(None)
#             t.widget().deleteLater()
#             self.ledit_Name[iRow].hide()
#             self.ledit_Name[iRow].deleteLater()
#             self.ledit_Name[iRow].setParent(None)
        self.ledit_Name.pop(iRow)

        ind = self.PropertyLayout.indexOf(self.pb_Row[iRow])
        t = self.PropertyLayout.takeAt(ind)
        t.widget().setParent(None)
#             t.widget().deleteLater()
#             self.pb_Row[iRow].hide()
#             self.pb_Row[iRow].deleteLater()
#             self.pb_Row[iRow].setParent(None)
        self.pb_Row.pop(iRow)

        for iAfterRow in range(iRow, self.nRows):
            self.ledit_Name[iAfterRow].setObjectName( 'ledit_Name_' + str(iAfterRow+1) )
            self.pb_Row[iAfterRow].setObjectName( 'ledit_Name_' + str(iAfterRow+1) )

        print 'Remove row', iRow

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

这里的问题是由 QGridLayout 的实现细节引起的。

每当从 QGridLayout 中删除项目时,logical行和列永远不会减少,即使visual行或列都可以。因此,您应该始终使用以下方法直接处理 GridLayout 中的项目获取项目位置 and 项目位置.

下面是重写的DesignerMainWindow使用这种方法的示例中的类。显然,它可能需要进行一些调整才能与您的实际应用程序配合使用。

class DesignerMainWindow(QtGui.QMainWindow, Ui_fiberModesMainWindow):
    def __init__(self, parent = None):
        super(DesignerMainWindow, self).__init__(parent)
        self.setupUi(self)
        self.pb_addRow_1.clicked.connect( self.addRow )

    def addRow( self ):
        rows = self.PropertyLayout.rowCount()
        columns = self.PropertyLayout.columnCount()
        for column in range(columns):
            layout = self.PropertyLayout.itemAtPosition(rows - 1, column)
            if layout is not None:
                widget = layout.widget()
                if isinstance(widget, QtGui.QPushButton):
                    widget.setText('Remove %d' % (rows - 1))
                    widget.clicked.disconnect(self.addRow)
                    widget.clicked.connect(self.removeRow)
                else:
                    widget.setEnabled(False)
        widget = QtGui.QLineEdit(self.centralwidget)
        self.PropertyLayout.addWidget(widget, rows, 1, 1, 1)
        widget = QtGui.QPushButton(self.centralwidget)
        widget.setText('Add Row')
        widget.clicked.connect(self.addRow)
        self.PropertyLayout.addWidget(widget, rows, columns - 1, 1, 1)

    def removeRow(self):
        index = self.PropertyLayout.indexOf(self.sender())
        row = self.PropertyLayout.getItemPosition(index)[0]
        for column in range(self.PropertyLayout.columnCount()):
            layout = self.PropertyLayout.itemAtPosition(row, column)
            if layout is not None:
                layout.widget().deleteLater()
                self.PropertyLayout.removeItem(layout)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

pyside - 如何从 gridLayout 中删除小部件 的相关文章

随机推荐

  • Rails 视图下拉列表中的日期格式

    我可以帮助您格式化视图中下拉列表中的日期字段 我的日期显示带有时间戳 我希望它们显示为 mm dd yyyy 在我的模型中 我有一个从表中选择日期字段的方法 def self get event dates event dates Ugra
  • 使用 mutate 和 for 循环(按变量名前缀)对多组变量进行 R rowSums

    我有多个变量按前缀 par fri gp 等 分组在一起 其中有 29 个组 每个变量的值为 0 或 1 我需要做的是对这些组 即 partner 1 Partner 2 等 求和 如果 rowSums 0 则使每个变量为 NA 例如 我的
  • 风险管理:如果已经做多,则不要下新订单

    如果该标志已经指示长 则不应有新的指示长的标志 如果标志不指示长计算表达式 longCondition if strategy long false rsi lt 30 and close gt moving avg shortCondit
  • 如何在 Cocoa OpenGL 程序中显示原始 YUV 帧

    我被分配的任务是编写一个程序 该程序获取示例原始 YUV 文件并将其显示在 Cocoa OpenGL 程序中 我是一名实习生 我几乎不知道如何开始 我一直在阅读维基百科和有关 YUV 的文章 但我找不到任何关于如何打开原始 YUV 文件 提
  • Xcode iOS:检查用户是否已登录,如果未登录则显示不同的视图

    我正在编写一个应用程序 其中登录用户比未登录用户拥有一些额外的功能 基本上 我或多或少有 5 个选项卡 当我启动应用程序时 用户立即获得登录页面 他可以决定跳过它 如果他跳过它 他就只有 3 个选项卡 如果他登录成功的话 就会有5个 我已经
  • 存储/分配经过身份验证的用户的角色

    我正在升级站点以使用 MVC 并且正在寻找设置身份验证的最佳方法 此时 我可以通过 Active Directory 进行登录 验证用户名和密码 然后设置身份验证 cookie 如何在登录时存储用户的角色信息 以便我的控制器在用户浏览站点时
  • 使用 Gradle 在 Android 项目中混合 Java+Scala 的最简单方法是什么?

    使用 Gradle 在 Android 项目中混合 Java Scala 的最简单方法是什么 是否使用https github com saturday06 gradle android scala plugin 我问这个是因为例子grad
  • python setuptools:如何安装带有 cython 子模块的包?

    我有一个名为的 python 包pytools 它包含一个基于 cython 的子模块nms 当我安装根包 pytools 时sudo python H setup py 根包似乎已正确安装 但安装时没有复制编译nms so to usr
  • 如何读取 json.txt 并解析 json python READ TXT PYTHON

    我有一个 txt 文件 resultJSON txt txt 文件中的数据为 JSON 格式 term dog results filename 1 jpg numberID D12 filename 23 jpg number E52 我
  • Mysql Workbench Mac OS 缺少管理工具和数据导入/导出

    所有管理工具均丢失 屏幕截图中的左侧选项卡 并且数据导入和导出菜单选项不起作用 我已经下载了官方安装mysql workbench community 6 1 7 osx i686并多次尝试安装 均未成功 新创建的模式可以正常工作 并且我可
  • PYTHON:从数组中搜索文件名,然后重新定位文件

    我是 Python 新手 确实需要一些帮助 我有大量图像正在分类 我需要每 260 张图像 例如 0 260 520 780 等 然后我需要将这些图像重新定位到新文件夹 到目前为止 这是我的代码 import os os path sys
  • 如何在Python中实现多线程函数?

    我在 Python 中创建了 2 个具有循环命令的函数 为了使进程更快 我想对它们进行多线程处理 例如 def loop1 while 1 lt 2 print something def loop2 while 5 gt 4 print
  • 二元一次方程的错误答案

    我想知道是否有人能告诉我为什么我的用于求解二次方程的 python 代码不起作用 我已经检查过了 没有发现任何错误 print This program will solve quadratic equations for you prin
  • Oracle 10g 时区混乱

    SELECT TO CHAR SYSDATE YYYY MM DD HH24 MI TO CHAR CURRENT DATE YYYY MM DD HH24 MI TO CHAR SYSTIMESTAMP YYYY MM DD HH24 M
  • Android getAbsolutePath() 不返回完整路径

    我创建一个文件并使用以下代码将图像保存到其中 private File createImageFile throws IOException String timeStamp new SimpleDateFormat yyMMdd HHmm
  • Windows.Storage.KnownFolders.MusicLibrary 路径返回空

    我正在尝试获取用 C 编写的 Windows 通用应用程序中的默认音乐库文件夹路径 然而 KnownFolders MusicLibrary Path返回空字符串 同时 await KnownFolders MusicLibrary Get
  • UISearchBar 增加了 iOS 11 中的导航栏高度

    我有我的UISearchBar成为导航栏的一部分 例如 let searchBar UISearchBar some more configuration to the search bar navigationItem titleView
  • 在 Maps API V2 中导入 KML

    我有多个 KML 文件 它们是在谷歌地球中绘制的 并且包含不同的路线 现在我正在尝试使用 Maps API V2 在我的 android 项目中显示这些内容 是否有一个现有的库可以在您的 Android 项目中导入 KML 文件并在地图中显
  • 使用asp.net 5 TestServer模拟外部Api调用

    我正在尝试使用测试服务器测试我的中间件 在中间件的某个地方 我的代码通过 HttpClient 调用 api 我想通过使用第二个测试服务器来模拟这一点 但想知道这是否可能 我已经尝试过 但出现错误 尝试连接 但服务器主动拒绝 代码如下 Fa
  • pyside - 如何从 gridLayout 中删除小部件

    我在 QT Designer 中构建了一个 ui 然后使用 pyside uic 将其转换为 python 文件 然后编写了一些代码以编程方式对其进行编辑 换句话说 我有一个按钮Add Row单击时会将其自身重命名为Remove1并创建另一