Russian Qt Forum
Ноябрь 23, 2024, 19:48 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: обработка сигнала виджета из таблицы QTableWidget  (Прочитано 7306 раз)
Child
Гость
« : Март 02, 2018, 11:50 »

Здраствуйте, у меня есть несколько таблиц QTableWidget. Элементы в этой таблице - виджеты QCheckBox и к каждому виджету на сигнал изменения статуса привешиваю один и тот же слот. Как мне определить виджет который испустил этот сигнал я понимаю, а как мне понять из какой таблице этот виджет?
Вот код
в цикле создаются виджеты :
Код
C++ (Qt)
       QCheckBox *checkBox = new QCheckBox(this);
       checkBox -> setToolTip(tr("Удалить"));
       checkBox -> setText(query.value(1).toString());
       connect(checkBox, SIGNAL(stateChanged(int)), this, SLOT(checkBoxTableChanged(int)));
       table -> setCellWidget(i, j+1, checkBox);
 
обработка слота
Код
C++ (Qt)
checkBoxTableChanged(int st){
   delete qobject_cast<QCheckBox*>(QObject::sender());
}
 

мне просто нужно при нажатии удалить этот виджет и соответственно ячейку из таблицы. Виджет удаляется, а как определить из какой он таблицы?
Записан
ViTech
Гипер активный житель
*****
Offline Offline

Сообщений: 858



Просмотр профиля
« Ответ #1 : Март 02, 2018, 13:38 »

По-моему, вы что-то странное пытаетесь делать Улыбающийся. Вы уверены, что именно таким способом хотите получить ячейку с флажком в таблице? Возможности Model/View Programming хорошо изучили? Как минимум можно поэкспериментировать с QTableWidgetItem::setFlags() и флагом Qt::ItemIsUserCheckable.
Записан

Пока сам не сделаешь...
Child
Гость
« Ответ #2 : Март 02, 2018, 13:56 »

Я знаю что CheckBoxможно создать и средствами QTableWidget ... создаю его таким образом, потому что хочу чтобы он немного по-другому отображался(не стандартно), т.е. переопределяю метод setStyleSheet() в QCheckBox. И вот мне нужно чтобы при нажатии на item этот элемент удалялся ... Можно конечно попробовать к каждому QTableWidget привязать сигнал по нажатию, просто у меня таблиц много и хотелось бы более универсальный метод
Записан
ViTech
Гипер активный житель
*****
Offline Offline

Сообщений: 858



Просмотр профиля
« Ответ #3 : Март 02, 2018, 14:37 »

Delegate Classes тоже не помогут?

У QCheckBox  кто parentWidget()? Если QTableWidget, то у него можно узнать модель model().
Записан

Пока сам не сделаешь...
ViTech
Гипер активный житель
*****
Offline Offline

Сообщений: 858



Просмотр профиля
« Ответ #4 : Март 02, 2018, 14:47 »

мне просто нужно при нажатии удалить этот виджет и соответственно ячейку из таблицы. Виджет удаляется, а как определить из какой он таблицы?

Согласно QTableWidget::setCellWidget():
Цитировать
Sets the given widget to be displayed in the cell in the given row and column, passing the ownership of the widget to the table.
QCheckBox самому удалять не надо. Нужно удалить ячейку в модели.
Записан

Пока сам не сделаешь...
Child
Гость
« Ответ #5 : Март 02, 2018, 15:04 »

вот я и пытаюсь определить из какой таблице этот QCheckBox, чтобы понять какую ячейку удалить ...

У QCheckBox  кто parentWidget()? Если QTableWidget, то у него можно узнать модель model().

с  parentWidget() тоже не получается, тоже изначально так думалось ((
Записан
Child
Гость
« Ответ #6 : Март 02, 2018, 15:07 »

А сигнал cellClicked ( int row, int column )  в QTableWidget почему то не срабатывает при нажатии на ячейку, может потому-что в ячейке QWidget
Записан
ViTech
Гипер активный житель
*****
Offline Offline

Сообщений: 858



Просмотр профиля
« Ответ #7 : Март 02, 2018, 15:23 »

Как правило, большое количество костылей указывает на то, что выбран неправильный путь Улыбающийся.

Вставлять QCheckBox в ячейку, по-моему, неправильный путь. У модели/вида достаточно средств, чтобы работать с флажками в ячейках. Если нужен определённый вид флажка в ячейке, то лучше попробовать самому его нарисовать в делегате. Посмотрите в исходниках Qt/ххх/Src/qtbase/src/widgets/widgets/qcheckbox.cpp как он рисуется, там вроде не всё так страшно Улыбающийся.
Записан

Пока сам не сделаешь...
Child
Гость
« Ответ #8 : Март 02, 2018, 15:39 »

Спасибо, попробую с помощью делегатов  Улыбающийся
Просто мне показалось что так удобнее ))
Записан
ViTech
Гипер активный житель
*****
Offline Offline

Сообщений: 858



Просмотр профиля
« Ответ #9 : Март 02, 2018, 15:54 »

Делегаты - рекомендованный путь для тонкой настройки внешнего вида и поведения элементов в ячейках. setCellWidget() - это может уже на крайний случай, когда нужно что-то нестандартное делать Улыбающийся.

Ради интереса, можете у своих QCheckBox посмотреть координаты, и по ним искать QTableWidget и ячейку в нём QTableWidget::itemAt(). Но это костыль Улыбающийся.

Кстати, ещё странным выглядит удаление ячейки при изменении состояния флажка. Обычно от QCheckBox другое поведение ожидается: пометить/снять отметку.
Записан

Пока сам не сделаешь...
Day
Частый гость
***
Offline Offline

Сообщений: 290


Просмотр профиля
« Ответ #10 : Март 02, 2018, 16:20 »

Child Один из возможных костылей - каждому CheckBox давать имя (objectName), в котором содержится номер строки и колонки. В этом же имени может содержаться тнформация о таблице. В слоте спрашивать у sender имя.
Но, наверное, есть лучшие способы.
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.114 секунд. Запросов: 24.