Créez votre widget personnalisé dans QtDesigner, sauf comme name.ui
. Dans CMDP aller au fichier name.ui
emplacement et utilisez cette commande pour le convertir en module python:
pyuic4 -x name.ui -o name.py
plus tard, vous pouvez importer ce module (widget personnalisé) et de l'utiliser dans votre interface graphique. Dans votre cas, vous pouvez créer une fenêtre principale avec QTableWidget et QPushButton de cette façon, mais vous ne pouvez pas créer de boutons dynamiques dans la table. Vous devez réimplémenter classe QPushButton comme ceci:
import YourMainWindowModule #YourMainWindowModule is MainWindow created in QtDesigner and it has QPushButton named "addRowButton" and QTableWidget named "tableWidget", both in grid layer
import sys
from PyQt4 import QtGui, QtCore
class MainWindow(QtGui.QMainWindow):
def __init__(self, parent = None):
QtGui.QWidget.__init__(self, parent)
self.ui = YourMainWindowModule.Ui_MainWindow()
self.ui.setupUi(self)
self.connect(self.ui.addRowButton, QtCore.SIGNAL('clicked()'), self.AddRowToTable)
self.connect(self, QtCore.SIGNAL("printButtonContent(PyQt_PyObject)"), self.PrintButtonContent)
def AddRowToTable(self):
rowData = ["some text", 65454, "more text"]# add what you want
self.ui.tableWidget.setColumnCount(len(rowData)+1)
row = self.ui.tableWidget.rowCount()
self.ui.tableWidget.insertRow(row)
for col in range(0, len(rowData)):
item = QtGui.QTableWidgetItem(QtCore.QString(unicode(rowData[col])))
self.ui.tableWidget.setItem(row, col, item)
button = OverloadedPushButton(row, self)# row number is this button's ID
button.setText("Button %s"%(row))
self.ui.tableWidget.setCellWidget(row, len(rowData), button)
def PrintButtonContent(self, rowId):
print "Id of the row where clicked overloaded push button is: ", rowId
#here you have rowId, so you know in which row button is clicked and you can do what you want
class OverloadedPushButton(QtGui.QPushButton):
def __init__(self, rowID, mainWindow):
super(OverloadedPushButton, self).__init__()
self.__rowID = rowID
self.__mainWindow = mainWindow
self.connect(self, QtCore.SIGNAL('clicked()'), self, QtCore.SLOT("triggerOutput()"))
@QtCore.pyqtSlot()
def triggerOutput(self):
self.__mainWindow.emit(QtCore.SIGNAL("printButtonContent(PyQt_PyObject)"), self.__rowID)
def main():
app = QtGui.QApplication(sys.argv)
form = MainWindow()
form.show()
app.exec_()
if __name__ == '__main__':
main()
J'espère que cette aide: Lorsque vous appuyez sur addRowButton
(QPushButton simples), AddRowToTable
ajoutera la ligne dans le tableau. Dans la dernière colonne de la ligne sera surchargé QPushButton qui, lorsqu'il est pressé, émet le signal printButtonContent
à mainWindow alors la méthode PrintButtonContent
va imprimer rowId. Vous pouvez surcharger n'importe quel widget de cette façon.
Si cela répond à votre question s'il vous plaît accepter la réponse, aussi, si vous avez besoin de plus de détails sur le code, n'hésitez pas à demander – Aleksandar