crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )

 
Ответить в данную темуНачать новую тему
> делагат для QTableWidget
borune
  опции профиля:
сообщение 2.2.2015, 13:31
Сообщение #1


Участник
**

Группа: Участник
Сообщений: 152
Регистрация: 1.1.2011
Пользователь №: 2314

Спасибо сказали: 0 раз(а)




Репутация:   0  


Господа, задача следующая: нужно вставить в таблицу кнопку. В обработчике клика на кнопку надо знать, в какой строке эта кнопка находится. Насколько я понял, если устанавливать кнопку в таблицу при помощи setCellWidget, то номер строки и столбца, где находится виджет узнать невозможно. Сигналы cellClicked и itemClicked не эмитируются ячейкой, в которую вставлен виджет. Как решить задачу?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
arhohryakov
  опции профиля:
сообщение 2.2.2015, 15:36
Сообщение #2


Новичок


Группа: Новичок
Сообщений: 4
Регистрация: 14.1.2015
Пользователь №: 4315

Спасибо сказали: 3 раз(а)




Репутация:   0  


Цитата(borune @ 2.2.2015, 15:31) *
Господа, задача следующая: нужно вставить в таблицу кнопку. В обработчике клика на кнопку надо знать, в какой строке эта кнопка находится. Насколько я понял, если устанавливать кнопку в таблицу при помощи setCellWidget, то номер строки и столбца, где находится виджет узнать невозможно. Сигналы cellClicked и itemClicked не эмитируются ячейкой, в которую вставлен виджет. Как решить задачу?

Создайте наследника Кнопки. В наследнике создайте необходимые поля (номер строки, ряда и т.д). Заполняйте их перед установкой кнопки в ячейку. По клику все данные будут внутри.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
borune
  опции профиля:
сообщение 2.2.2015, 15:41
Сообщение #3


Участник
**

Группа: Участник
Сообщений: 152
Регистрация: 1.1.2011
Пользователь №: 2314

Спасибо сказали: 0 раз(а)




Репутация:   0  


Цитата(arhohryakov @ 2.2.2015, 16:36) *
Создайте наследника Кнопки. В наследнике создайте необходимые поля (номер строки, ряда и т.д). Заполняйте их перед установкой кнопки в ячейку. По клику все данные будут внутри.


Спасибо, этот вариант я рассматривал. Но я хотел изучить делегаты, вот сейчас пытаюсь разобраться в кутэшном примере. Но походу дела мне тут QItemDelegate не поможет, там есть только метод createEditor, который позволяет редактировать содержимое ячейки, используя заданный виджет, а мне же нужно просто отображать вместо ячейки виджет. Я прав?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
lanz
  опции профиля:
сообщение 3.2.2015, 9:32
Сообщение #4


Старейший участник
****

Группа: Участник
Сообщений: 690
Регистрация: 28.12.2012
Пользователь №: 3660

Спасибо сказали: 113 раз(а)




Репутация:   8  


Чтобы делать через делегат можно использовать
http://qt-project.org/doc/qt-4.8/qabstract...ersistentEditor
Но вообще мне кажется проще через
http://qt-project.org/doc/qt-4.8/qabstract...#setIndexWidget
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
borune
  опции профиля:
сообщение 3.2.2015, 11:25
Сообщение #5


Участник
**

Группа: Участник
Сообщений: 152
Регистрация: 1.1.2011
Пользователь №: 2314

Спасибо сказали: 0 раз(а)




Репутация:   0  


Цитата(lanz @ 3.2.2015, 10:32) *
Но вообще мне кажется проще через
http://qt-project.org/doc/qt-4.8/qabstract...#setIndexWidget


либо я что-то не так делаю, либо одно из двух. Пишу так:
QTableWidget *table = new QTableWidget;
...
connect(table,SIGNAL(cellClicked(int,int)),SLOT(cell_clicked(int,int)));
...
QPushButton *btnStopGo = new QPushButton(tr("Старт"))
table->setIndexWidget(table->model()->index(iter,10),btnStopGo);


При нажатии на кнопку я не попадаю в слот cell_clicked. То есть, по крайней мере, если судить по реакции на нажатие, методы setCellWidget и setIndexWidget ведут себя вроде бы одинаково.

Сообщение отредактировал borune - 3.2.2015, 11:26
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
lanz
  опции профиля:
сообщение 3.2.2015, 11:52
Сообщение #6


Старейший участник
****

Группа: Участник
Сообщений: 690
Регистрация: 28.12.2012
Пользователь №: 3660

Спасибо сказали: 113 раз(а)




Репутация:   8  


Делайте коннект к сигналу кнопки.
Чтобы разобрать разные кнопки используйте QSignalMapper.

Либо если у вас новый компилятор:
connect(btnStopGo,&QPushButton::clicked,[](){cell_clicked(1,3);});

Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
borune
  опции профиля:
сообщение 3.2.2015, 12:11
Сообщение #7


Участник
**

Группа: Участник
Сообщений: 152
Регистрация: 1.1.2011
Пользователь №: 2314

Спасибо сказали: 0 раз(а)




Репутация:   0  


Цитата(lanz @ 3.2.2015, 12:52) *
Делайте коннект к сигналу кнопки.

а как в обработчике клика по кнопке определить, в какой ячейке таблицы она находится?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
lanz
  опции профиля:
сообщение 3.2.2015, 13:17
Сообщение #8


Старейший участник
****

Группа: Участник
Сообщений: 690
Регистрация: 28.12.2012
Пользователь №: 3660

Спасибо сказали: 113 раз(а)




Репутация:   8  


btnStopGo->setProperty("MyAwesomeCellRow", 1);
btnStopGo->setProperty("MyAwesomeCellCol", 3);


И в получателе
obj->property("My...").toInt()



Либо как предлагали выше, отнаследовать свою кнопку.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0




RSS Текстовая версия Сейчас: 23.4.2024, 15:31