Russian Qt Forum

Qt => Вопросы новичков => Тема начата: Child от Март 02, 2018, 11:50



Название: обработка сигнала виджета из таблицы QTableWidget
Отправлено: 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());
}
 

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


Название: Re: обработка сигнала виджета из таблицы QTableWidget
Отправлено: ViTech от Март 02, 2018, 13:38
По-моему, вы что-то странное пытаетесь делать :). Вы уверены, что именно таким способом хотите получить ячейку с флажком в таблице? Возможности Model/View Programming (http://doc.qt.io/qt-5/model-view-programming.html) хорошо изучили? Как минимум можно поэкспериментировать с QTableWidgetItem::setFlags() (http://doc.qt.io/qt-5/qtablewidgetitem.html#setFlags) и флагом Qt::ItemIsUserCheckable (http://doc.qt.io/qt-5/qt.html#ItemFlag-enum).


Название: Re: обработка сигнала виджета из таблицы QTableWidget
Отправлено: Child от Март 02, 2018, 13:56
Я знаю что CheckBoxможно создать и средствами QTableWidget ... создаю его таким образом, потому что хочу чтобы он немного по-другому отображался(не стандартно), т.е. переопределяю метод setStyleSheet() в QCheckBox. И вот мне нужно чтобы при нажатии на item этот элемент удалялся ... Можно конечно попробовать к каждому QTableWidget привязать сигнал по нажатию, просто у меня таблиц много и хотелось бы более универсальный метод


Название: Re: обработка сигнала виджета из таблицы QTableWidget
Отправлено: ViTech от Март 02, 2018, 14:37
Delegate Classes (http://doc.qt.io/qt-5/model-view-programming.html#delegate-classes) тоже не помогут?

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


Название: Re: обработка сигнала виджета из таблицы QTableWidget
Отправлено: ViTech от Март 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 самому удалять не надо. Нужно удалить ячейку в модели.


Название: Re: обработка сигнала виджета из таблицы QTableWidget
Отправлено: Child от Март 02, 2018, 15:04
вот я и пытаюсь определить из какой таблице этот QCheckBox, чтобы понять какую ячейку удалить ...

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

с  parentWidget() тоже не получается, тоже изначально так думалось ((


Название: Re: обработка сигнала виджета из таблицы QTableWidget
Отправлено: Child от Март 02, 2018, 15:07
А сигнал cellClicked ( int row, int column )  в QTableWidget почему то не срабатывает при нажатии на ячейку, может потому-что в ячейке QWidget


Название: Re: обработка сигнала виджета из таблицы QTableWidget
Отправлено: ViTech от Март 02, 2018, 15:23
Как правило, большое количество костылей указывает на то, что выбран неправильный путь :).

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


Название: Re: обработка сигнала виджета из таблицы QTableWidget
Отправлено: Child от Март 02, 2018, 15:39
Спасибо, попробую с помощью делегатов  :)
Просто мне показалось что так удобнее ))


Название: Re: обработка сигнала виджета из таблицы QTableWidget
Отправлено: ViTech от Март 02, 2018, 15:54
Делегаты - рекомендованный путь для тонкой настройки внешнего вида и поведения элементов в ячейках. setCellWidget() - это может уже на крайний случай, когда нужно что-то нестандартное делать :).

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

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


Название: Re: обработка сигнала виджета из таблицы QTableWidget
Отправлено: Day от Март 02, 2018, 16:20
Child Один из возможных костылей - каждому CheckBox давать имя (objectName), в котором содержится номер строки и колонки. В этом же имени может содержаться тнформация о таблице. В слоте спрашивать у sender имя.
Но, наверное, есть лучшие способы.