2013-02-18 15 views
0

Quelqu'un peut-il me suggérer la meilleure pratique pour créer un widget personnalisé en utilisant PyQt4?Création d'un widget personnalisé à l'aide de QtDesigner PyQt4

Je veux voir comment aborder ajouter QPushButton ou QCheckboxGroup à l'intérieur des cellules de QTable Widgets qui seront ajoutés sur l'utilisateur en cliquant sur Ajouter une nouvelle ligne à QTable lors de l'exécution

Répondre

1

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.

+0

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