Создайте свой собственный виджет в 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. Вы можете перегрузить любой виджет, который вы хотите, таким образом.
Если это ответ на ваш вопрос, пожалуйста, примите ответ, также, если вам нужна дополнительная информация о коде, не стесняйтесь спрашивать – Aleksandar