LINUX.ORG.RU

Qtablewidget и contextmenu

 ,


0

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

KLTable - это QtableWidget print (row) выдает None хотя значения в ячейке есть если print (event.pos()) там координаты есть

В чем может быть проблема?


Ответ на: комментарий от RazrFalcon

У меня есть такой код:

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)

Я хочу, чтобы когда пользователь кликал правой кнопкой мыши на ячейку всплывало контекстное меню. Где был бы Экшн на добавление значения в эту ячейку.

Соответственно у меня затык в этом куске:

  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

tits ()

Немного не по теме, но тем не менее – не используй виджеты, используй вьюшки. Какой бы простой ни была задача ты всё равно скорее всего упрешься в ограничения виджетов.

Stil ★★★★★ ()
Ответ на: комментарий от Stil

Пошел по другому пути

Но и тут затык:

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 всех, что покликали, а не последний. Почему он выводить на печать все?

tits ()