У меня есть такой код:
Python
class WindowsOutCallC(QDialog):
def __init__(self):
super().__init__()
self.main()
self.ConstData()
def main(self):
ICText = "наименование контрагента"
GText = "город"
INNText = "инн контрагента"
KLText = "контактное лицо"
DText = "должность"
NText = "номер"
DTText = "дата"
NSText = "наименование события"
CText = "комментарий"
self.grid100 = QGridLayout()
self.grid100.setSpacing(2)
self.ICTextLine = QLineEdit(self)
self.INNTextLine = QLineEdit(self)
self.GTextLine = QLineEdit(self)
#self.KLTextTextLine = QLineEdit(self)
#self.DTextLine = QLineEdit(self)
self.CTextLine = QTextEdit(self)
#self.NTextLine = QLineEdit(self)
self.CBTNAdd = QPushButton("Добавить номер ")
self.KLTable = QTableWidget()
self.ICTextLine.setText(ICText)
self.INNTextLine.setText(INNText)
self.GTextLine.setText(GText)
#self.KLTextTextLine.setText(KLText)
#self.DTextLine.setText(DText)
self.CTextLine.setText(CText)
#self.NTextLine.setText(NText)
#print (result[0])
#for line in result:
# print (line)
# print (line[0])
self.KLTable.setRowCount(5)
self.KLTable.setColumnCount(10)
self.KLTable.setHorizontalHeaderLabels(["Код","Имя","Фамилия", "Отчество", "Должность", "Номер 1", "Номер 2", "Номер 3", "Номер 4", "Номер 5"])
self.grid100.addWidget(self.ICTextLine, 0, 0, 1, 4)
self.grid100.addWidget(self.INNTextLine, 1, 0, 1, 4)
self.grid100.addWidget(self.GTextLine, 2, 0, 1, 4)
#self.grid100.addWidget(self.KLTextTextLine, 3, 0, 1, 1)
#self.grid100.addWidget(self.DTextLine, 3, 1, 1, 1)
#self.grid100.addWidget(self.NTextLine, 3, 2, 1, 1)
#self.grid100.addWidget(self.CBTNAdd, 3, 3, 1, 1)
self.grid100.addWidget(self.CTextLine, 4, 0, 1, 4)
self.grid100.addWidget(self.KLTable, 5, 0, 1, 4)
self.setLayout(self.grid100)
self.setMinimumHeight(600)
self.setMinimumWidth(1000)
#self.KLTable.cellDoubleClicked.connect(self.Update2SQL)
#self.KLTable.cellDoubleClicked.connect(self.handleCellActivated)
def ConstData(self):
result = check_number("3434")
print(result)
if result:
k = (len(result))
print(k)
self.KLTable.setRowCount(k+3)
for r in range(k):
print(result[r][1])
print(result[r][2])
print(result[r][3])
print(result[r][4])
print(result[r][5])
print(result[r][6])
print(result[r][7])
print(result[r][8])
print(result[r][9])
self.KLTable.setItem(r, 0, QTableWidgetItem(str(result[r][0])))
self.KLTable.setItem(r, 1, QTableWidgetItem(result[r][2]))
self.KLTable.setItem(r, 2, QTableWidgetItem(result[r][3]))
self.KLTable.setItem(r, 3, QTableWidgetItem(result[r][4]))
self.KLTable.setItem(r, 4, QTableWidgetItem(result[r][5]))
self.KLTable.setItem(r, 5, QTableWidgetItem(result[r][6]))
self.KLTable.setItem(r, 6, QTableWidgetItem(result[r][7]))
self.KLTable.setItem(r, 7, QTableWidgetItem(result[r][8]))
self.KLTable.setItem(r, 8, QTableWidgetItem(result[r][9]))
self.KLTable.setItem(r, 9, QTableWidgetItem(result[r][10]))
codec = query_to_base("select name, inn, city, comment from c where codec='" + str(result[0][1]) + "';")
print(codec)
self.ICTextLine.setText(codec[0][0])
self.INNTextLine.setText(codec[0][1])
self.GTextLine.setText(codec[0][2])
self.CTextLine.setText(codec[0][3])
self.KLTable.cellChanged.connect(self.Update2SQL)
def contextMenuEvent(self, event):
self.menu = QMenu(self)
renameAction = QAction('Rename', self)
renameAction.triggered.connect(lambda: self.renameSlot(event))
self.menu.addAction(renameAction)
# add other required actions
self.menu.popup(QtGui.QCursor.pos())
def renameSlot(self, event):
print ("renaming slot called")
# get the selected row and column
print (event.pos().x())
item = self.KLTable.itemAt(event.pos())
print (item)
row = self.KLTable.itemAt(event.pos())
print (row)
print (col)
# get the selected cell
#cell = self.KLTable.item(row, col)
# get the text inside selected cell (if any)
# get the widget inside selected cell (if any)
widget = self.KLTable.cellWidget(row, col)
Я хочу, чтобы когда пользователь кликал правой кнопкой мыши на ячейку всплывало контекстное меню. Где был бы Экшн на добавление значения в эту ячейку.
Соответственно у меня затык в этом куске:
Python
def renameSlot(self, event):
print ("renaming slot called")
# get the selected row and column
print (event.pos().x())
item = self.KLTable.itemAt(event.pos())
print (item)
row = self.KLTable.itemAt(event.pos())
print (row)
print (col)
# get the selected cell
#cell = self.KLTable.item(row, col)
# get the text inside selected cell (if any)
# get the widget inside selected cell (if any)
widget = self.KLTable.cellWidget(row, col)
А именно: item = self.KLTable.itemAt(event.pos()) print (item)
В ячейке значение есть, а принт мне выдает:None
Пошел по другому пути
Но и тут затык:
Python
self.KLTable.cellClicked.connect(self.cbtn)
def cbtn(self, row, column):
print (row)
print (column)
self.CBTNAdd.clicked.connect(lambda: self.cbtnpush(row, column))
def cbtnpush(self, row, column):
print(column)
print(row)
Если кликнуть на одну ячейку и потом нажать кнопку, то выдаст row и column Но если перед тем как нажать кнопку - по кликать по нескольким ячейкам то выдает row и column всех, что покликали, а не последний. Почему он выводить на печать все?
Вам нужен сигнал customContextMenuRequested (http://doc.qt.io/qt-4.8/qwidget.html#customContextMenuRequested) и установка http://doc.qt.io/qt-4.8/qwidget.html#contextMenuPolicy-prop
После в слоте показывать меню
Такое (https://github.com/search?q=user%3Agil9red++customContextMenuRequested+&type=Code&utf8=%E2%9C%93)когда-то уже делал