2013-02-18 8 views
0

Может ли кто-нибудь предложить мне лучшую практику создания пользовательского виджета с использованием PyQt4?создание пользовательского виджета с использованием QtDesigner PyQt4

Я хочу видеть, как подойти добавление QPushButton или QCheckboxGroup внутри клеток QTable виджетов, которые будут добавлены на пользователя щелкая добавить новую строку в QTable во время выполнения

ответ

1

Создайте свой собственный виджет в QtDesigner, сохранить его как name.ui , В ПРРКЕ перейти в файл name.ui местоположения и использовать эту команду, чтобы преобразовать его в модуль питона:

pyuic4 -x name.ui -o name.py 

позже вы можете импортировать этот модуль (собственный виджет) и использовать его в графическом интерфейсе. В этом случае вы можете создать главное окно с QTableWidget и QPushButton таким образом, но вы не сможете создавать динамические кнопки внутри таблицы. Вы должны повторно реализовать класс QPushButton так:

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() 

Я надеюсь, что это помогает: При нажатии addRowButton (простой QPushButton), AddRowToTable добавит строку в таблице. В последнем столбце строки будет перегружен QPushButton, который при нажатии выдаёт сигнал printButtonContent на mainWindow, поэтому метод PrintButtonContent будет печатать rowId. Вы можете перегрузить любой виджет, который вы хотите, таким образом.

+0

Если это ответ на ваш вопрос, пожалуйста, примите ответ, также, если вам нужна дополнительная информация о коде, не стесняйтесь спрашивать – Aleksandar

 Смежные вопросы

  • Нет связанных вопросов^_^