我需要具有通过.addWidget创建无限小部件的能力(在网格中,新的小部件-新行)。这东西我已经有了。但是我还需要能够按其位置删除小部件的功能。我试过了:
from PyQt5 import QtWidgets, QtGui
from PyQt5.QtCore import QTime, QTimer, QObject
from PyQt5.QtWidgets import QMainWindow, QApplication, QLCDNumber, QPushButton, QGridLayout, QLabel, QLineEdit, QTextEdit, QGroupBox
import sys
from somethingtestui import Ui_MainWindow
global selection
selection = 1
class mywindow(QtWidgets.QMainWindow):
def __init__(self):
super(mywindow, self).__init__()
self.ui = Ui_MainWindow()
self.ui.setupUi(self)
self.ui.pushButton.clicked.connect(self.add)
def add(self):
global selection
self.row = QTextEdit('')
self.text3 = QPushButton('Delete row')
self.ui.gridLayout.addWidget(self.row, selection, 0, 1, 1)
self.ui.gridLayout.addWidget(self.text3, selection, 1, 1, 1)
# global delf
def delf():
global selection
selection = selection-1
number = self.ui.gridLayout.itemAtPosition(selection,1)
print(number)
self.row.deleteLater()
self.rrow = None
self.text3.deleteLater()
self.text3 = None
self.text3.clicked.connect(delf)
selection = selection+1
app = QtWidgets.QApplication([])
application = mywindow()
application.show()
sys.exit(app.exec())
有了它,我可以添加许多小部件。如果有一个创建的窗口小部件,我可以删除它并重复它。但是,如果有2个或多个创建的小部件,我可以删除其中一个,然后在另一行中单击“删除”按钮后崩溃:
Traceback (most recent call last):
File "E:\Programs\YandexDisk\Tempfiles\TournamentBot\testi22.py", line 31, in delf
self.row.deleteLater()
RuntimeError: wrapped C/C++ object of type QTextEdit has been deleted
我为自己找到了解决方案
from somethingtestui import Ui_MainWindow
global rowcnt
rowcnt = 1
class mywindow(QtWidgets.QMainWindow):
def __init__(self):
super(mywindow, self).__init__()
self.ui = Ui_MainWindow()
self.ui.setupUi(self)
self.ui.pushButton.clicked.connect(self.add)
self.ui.gridLayout.setRowMinimumHeight(50,50)
self.ui.gridLayout.setColumnMinimumWidth(50,50)
def add(self):
global rowcnt
self.row = QTextEdit('')
self.delbtn = QPushButton('Delete row')
self.ui.gridLayout.addWidget(self.row, rowcnt, 0, 1, 1)
self.ui.gridLayout.addWidget(self.delbtn, rowcnt, 1, 1, 1)
w = self.ui.gridLayout.itemAtPosition(rowcnt,1).widget()
def delf(currow):
global rowcnt
rowcnt = rowcnt-1
number = self.ui.gridLayout.itemAtPosition(currow,1).widget()
number2 = self.ui.gridLayout.itemAtPosition(currow,0).widget()
number.deleteLater()
number2.deleteLater()
w.clicked.connect(lambda: delf(mrowcnt))
rowcnt = rowcnt+1
mrowcnt = rowcnt-1