我需要獲取在 pyqt5 中動態創建的按鈕的索引或位置,我有這段代碼,但目前當我單擊 [-] 按鈕時,我得到了最后添加的按鈕的位置。
import sys
from PyQt5.QtWidgets import (QLineEdit, QLabel, QGridLayout, QWidget,
QPushButton, QApplication, QSpinBox)
class Window(QWidget):
def __init__(self):
super().__init__()
#Creating grid
self.grid = QGridLayout()
self.setLayout(self.grid)
#Creating elements
self.spn_amount = QSpinBox(self)
self.txt_registercode = QLineEdit(self)
self.txt_description = QLineEdit(self)
self.txt_cost = QLineEdit(self)
self.txt_total = QLineEdit(self)
self.btn_add = QPushButton(" ",self) #Button that add rows
#adding functionality to [ ] button
self.btn_add.clicked.connect(self.getrow_add)
#Adding elements to grid
self.grid.addWidget(self.spn_amount, 0, 0)
self.grid.addWidget(self.txt_registercode, 0, 1)
self.grid.addWidget(self.txt_description, 0, 2)
self.grid.addWidget(self.txt_cost, 0, 3)
self.grid.addWidget(self.txt_total, 0, 4)
self.grid.addWidget(self.btn_add, 0, 5)
self.row = 0
self.column = 0
def getrow_add(self): #Function that get a the actual row of the button to create a new row after
self.row = self.grid.rowCount() #Obtener el número de filas actuales en el grid
self.column = self.grid.columnCount() #Obtiene el número de columnas actuales en el grid
self.addtextbox()
def getrow_del(self):
index = self.grid.indexOf(self.btn_del_din)
position = self.grid.getItemPosition(index)
self.row = position[0] #Obtengo la posición de la fila
self.column = self.grid.columnCount() #Obtiene el número de columnas actuales en el grid
print(self.row)
def addtextbox(self):
self.lineEdits = []
#Creation of dynamicall elements
self.spn_amount_din = QSpinBox(self)
self.txt_registercode_din = QLineEdit(self)
self.txt_description_din = QLineEdit(self)
self.txt_cost_din = QLineEdit(self)
self.txt_total_din = QLineEdit(self)
self.btn_del_din = QPushButton("-",self) #Button that delete rows
#Adding functionality to the [-] button
self.btn_del_din.clicked.connect(self.getrow_del)
#Dynamically adding elements to grid
self.grid.addWidget(self.spn_amount_din, self.row, 0)
self.grid.addWidget(self.txt_registercode_din, self.row, 1)
self.grid.addWidget(self.txt_description_din, self.row, 2)
self.grid.addWidget(self.txt_cost_din, self.row, 3)
self.grid.addWidget(self.txt_total_din, self.row, 4)
self.grid.addWidget(self.btn_del_din, self.row, 5)
self.lineEdits.append('')
def deltextbox(self):
for i in range (1, self.column):
self.grid.itemAtPosition(self.row, i).widget().deleteLater()
if __name__ == "__main__":
application = QApplication(sys.argv)
window = Window()
window.setWindowTitle('Dynamically add elements')
window.show()
sys.exit(application.exec_())
當我單擊 [-] 按鈕時,我需要獲取該小部件的特定位置。
這是我的圖形用戶界面
例如這里我有 6 行和 6 列,如果我單擊第一個按鈕 [-] 我希望將行的值作為 1,將列的值作為 5,但是我得到的值不是來自第一個按鈕 [-] 但從最后添加的第 5 行和第 5 列獲得。
在我的代碼中,我通過以下函式得到了它:
def getrow_del(self):
index = self.grid.indexOf(self.btn_del_din)
position = self.grid.getItemPosition(index)
self.row = position[0] #Obtengo la posición de la fila
self.column = self.grid.columnCount() #Obtiene el número de columnas actuales en el grid
print(self.row)
uj5u.com熱心網友回復:
您的代碼的主要問題是每次創建新行時都會不斷地覆寫實體屬性。
當使用動態創建物件的函式時,你不應該為這些物件創建實體屬性,除非你特別想保留對最后創建的元素的參考(這不是你的情況)。
為了正確保留對這些元素的參考,必須將它們添加到作為實體屬性的持久物件容器(例如串列)中。
class Window(QWidget):
def __init__(self):
super().__init__()
self.grid = QGridLayout(self)
self.items = []
self.addRow()
def addRow(self):
spn_amount_din = QSpinBox()
txt_registercode_din = QLineEdit()
txt_description_din = QLineEdit()
txt_cost_din = QLineEdit()
txt_total_din = QLineEdit()
row = len(self.items)
if row == 0:
button = QPushButton(' ')
button.clicked.connect(self.addRow)
else:
button = QPushButton('-')
button.clicked.connect(lambda: self.removeRow())
row_items = (spn_amount_din, txt_registercode_din, txt_description_din, txt_cost_din, txt_total_din, button)
self.items.insert(row, row_items)
for column, widget in enumerate(row_items):
self.grid.addWidget(widget, row, column)
def removeRow(self, row=None):
if row is None:
button = self.sender()
for row, widgets in enumerate(self.items):
if button in widgets:
break
widgets = self.items.pop(row)
for widget in widgets:
self.grid.removeWidget(widget)
widget.deleteLater()
self.adjustSize()
請注意,雖然 QGridLayout 提供rowCount()和columnCount(),但應謹慎使用它們,因為它們主要用于內部和基本的靜態目的:洗掉小部件時不會更新行數和列數;這意味著如果您想實作更高級的實作(例如插入行或排序專案),QGridLayout 通常不是合適的候選者。
更好的解決方案是使用主 QVBoxLayout 并將每一行添加為嵌套的QHBoxLayout,但更好的實作實際上應該使用一個類作為所有小部件的容器,這使得整個概念更易于管理并允許直接訪問每一行使用其屬性的元素:
class OrderWidget(QWidget):
def __init__(self):
super().__init__()
self.spn_amount_din = QSpinBox()
self.txt_registercode_din = QLineEdit()
self.txt_description_din = QLineEdit()
self.txt_cost_din = QLineEdit()
self.txt_total_din = QLineEdit()
self.button = QPushButton()
layout = QHBoxLayout(self)
layout.addWidget(self.spn_amount_din)
layout.addWidget(self.txt_registercode_din)
layout.addWidget(self.txt_description_din)
layout.addWidget(self.txt_cost_din)
layout.addWidget(self.txt_total_din)
layout.addWidget(self.button)
class Window(QWidget):
def __init__(self):
super().__init__()
QVBoxLayout(self) # just create the layout and set it
self.items = []
self.insertRow(0)
def insertRow(self, row=None):
if row is None:
row = len(self.items)
widget = OrderWidget()
self.layout().addWidget(widget)
self.items.insert(row, widget)
if row == 0:
widget.button.setText(' ')
widget.button.clicked.connect(lambda: self.insertRow())
else:
widget.button.setText('-')
widget.button.clicked.connect(lambda: self.removeRow(widget))
def removeRow(self, row):
if isinstance(row, QWidget):
widget = row
row = self.items.index(widget)
else:
widget = self.items[row]
self.layout().removeWidget(widget)
widget.deleteLater()
del self.items[row]
self.adjustSize()
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/434207.html
