Форум программистов, компьютерный форум, киберфорум
Python: GUI, графика
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.73/11: Рейтинг темы: голосов - 11, средняя оценка - 4.73
0 / 0 / 0
Регистрация: 18.04.2016
Сообщений: 5

Контекстное меню для ячейки QTablewidget

18.09.2017, 13:38. Показов 2248. Ответов 8
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
У меня есть такой код:
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
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
1
2
3
4
5
6
7
8
9
10
11
12
13
14
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
1
2
3
4
5
6
7
8
9
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 всех, что покликали, а не последний. Почему он выводить на печать все?
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
18.09.2017, 13:38
Ответы с готовыми решениями:

Контекстное меню в QTableWidget
Делаю всё как в примере http://www.evileg.ru/baza-znanij/qt/qmenu-kontekstnoe-menyu-v-qtableview.html но ничего не работает, в...

Показать/скрыть контекстное меню в зависимости от значения ячейки
Контекстное меню должно выпадать только при клике правой кнопкой мыши на 2 столбец datagridview, в зависимости от значения ячеек. Если...

Как создать контекстное меню. Например нажимая на richTextBox правой кнопкой мыши, мне бы предоставлялось контекстное меню
Как создать контекстное меню. Например нажимая на richTextBox правой кнопкой мыши, мне бы предоставлялось контекстное меню???

8
59 / 49 / 19
Регистрация: 16.06.2015
Сообщений: 206
18.09.2017, 15:02
Ну тут несколько другой раздел форума "C++ > Кроссплатформенная разработка > Qt"
0
Эксперт Python
 Аватар для dondublon
4652 / 2072 / 366
Регистрация: 17.03.2012
Сообщений: 10,182
Записей в блоге: 6
19.09.2017, 17:28
Цитата Сообщение от ispryt Посмотреть сообщение
Но если перед тем как нажать кнопку - по кликать по нескольким ячейкам то выдает row и column всех, что покликали
Цитата Сообщение от ispryt Посмотреть сообщение
.cellClicked.connect(self.cbtn)
Ну так к чему сконнектили - то и выдаёт.

Цитата Сообщение от ispryt Посмотреть сообщение
def cbtn(self, row, column):
* * * print (row)
* * * print (column)
* * * self.CBTNAdd.clicked.connect(lambda: self.cbtnpush(row, column))
Не надо так делать. Во-первых, происходит многократная привязка события, во-вторых, лямбда тут не при чём. Я даже не представляю, что там в итоге получится.
0
0 / 0 / 0
Регистрация: 18.04.2016
Сообщений: 5
21.09.2017, 11:56  [ТС]
Хорошо тогда в какую сторону мне копать если я хочу выделить ячейку - получить от нее row, column и передать их когда нажмется кнопка(размещенная не в таблице). и далее кнопка выполняет нужные мне действия.
Спасибо
0
Эксперт Python
 Аватар для dondublon
4652 / 2072 / 366
Регистрация: 17.03.2012
Сообщений: 10,182
Записей в блоге: 6
21.09.2017, 12:15
То есть надо получить row и column позже, а не при событии клика?
0
0 / 0 / 0
Регистрация: 18.04.2016
Сообщений: 5
21.09.2017, 12:22  [ТС]
dondublon,
Пользователь кликает по ячейке, но пока не нажмет кнопку Добавить номер номер не добавится.
Т.е как row и column получить при клике на ячейке и нажатие кнопки добавить номер
Миниатюры
Контекстное меню для ячейки QTablewidget  
0
Эксперт Python
 Аватар для dondublon
4652 / 2072 / 366
Регистрация: 17.03.2012
Сообщений: 10,182
Записей в блоге: 6
21.09.2017, 14:18
Цитата Сообщение от ispryt Посмотреть сообщение
при клике на ячейке и нажатие кнопки добавить номер
Это ДВА РАЗНЫХ момента времени. Ведь нажатие кнопки происходит ПОСЛЕ клика.
Для второго используйте selectionModel. У меня всё. Слишком трудно продираться сквозь ваши слова.
0
0 / 0 / 0
Регистрация: 18.04.2016
Сообщений: 5
21.09.2017, 14:20  [ТС]
dondublon,
ну задача ясна не понятно только куда копать:
Пользователь выделил ячейку, нажал кнопку свершилось действие с данными из этой ячейки.
0
Эксперт Python
 Аватар для dondublon
4652 / 2072 / 366
Регистрация: 17.03.2012
Сообщений: 10,182
Записей в блоге: 6
21.09.2017, 14:22
selectionModel
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
21.09.2017, 14:22
Помогаю со студенческими работами здесь

Контекстное меню для ListView...
Есть такой ListView. Как сделать, что при нажатии на верхней полоске появлялось контекстное меню, там где можно перетаскивать колонки,...

Контекстное меню для QGraphicsItem
Доброе время суток. Только изучаю с++на qt. возник такой вопрос. есть элемент класса QGraphicsItem. Надо чтоб при нажатии на кнопку мыши...

Контекстное меню для Pushpin
Здравствуйте! Пишу приложение под WP8, есть карта, на ней метки. Есть возможность по нажатию на метку открыть контекстное меню или же...

Контекстное меню для PictureBox
Доброе время суток всем. У меня возник вопрос: Подскажите как контекстное меню можно добавить к imeg.bmp которое создано в...

Контекстное меню для QGraphicsItem
Доброго времени суток. Есть наследники от QGraphicsItem, различные. За каждым графическим объектом есть логический класс. Вначале делал...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
SDL3 для Web (WebAssembly): Сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
SDL3 для Web (WebAssembly): Установка Emscripten SDK (emsdk) и CMake для сборки C и C++ приложений в Wasm
8Observer8 30.01.2026
Содержание блога Для того чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. . . .
SDL3 для Android: Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
SDL3 для Android: Загрузка PNG с альфа-каналом с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru