Ответ 1
Ваш QTreeWidgetItem
напрямую связан с вашими данными модели, поэтому вам необходимо подключиться к вашему сигналу модели QTreeWidget QAbstractItemModel::dataChanged
, чтобы получить уведомление об этом изменении.
Я создал флажок, который также содержит QTreeWidgetItem, используя следующий код.
//Populate list
QTreeWidgetItem *program = createCheckedTreeItem(QString::fromStdString(itr->first), true);
treePrograms->addTopLevelItem(program);
QTreeWidgetItem* ConfigDialog::createCheckedTreeItem(QString name,bool checkBoxState)
{
QTreeWidgetItem *item = new QTreeWidgetItem(QStringList(name));
item->setFlags(item->flags()|Qt::ItemIsUserCheckable);
if (checkBoxState)
{
item->setCheckState(0,Qt::Unchecked);
}
else
{
item->setCheckState(0,Qt::Checked);
}
return item;
}
Мне нужен способ подключения сигнала и слота, когда изменяется состояние этого флажка. В настоящее время я реализовал это ниже, но, к сожалению, не работает. Может кто-нибудь объяснить, что я делаю неправильно, и что мне нужно сделать, чтобы связать его?
connect(program, SIGNAL(toggled(bool)), this, SLOT(programChecked(bool)));
Ваш QTreeWidgetItem
напрямую связан с вашими данными модели, поэтому вам необходимо подключиться к вашему сигналу модели QTreeWidget QAbstractItemModel::dataChanged
, чтобы получить уведомление об этом изменении.
Вам нужно захватить сигнал itemChanged ( QTreeWidgetItem * item, int column )
, исходящий из QTreeWidget.
Подключитесь к сигналу itemClicked(QTreeWidgetItem* item, int column)
дерева. При обработке сигнала просто подтвердите item->checkState(column)
.
Лучшее решение, которое мы нашли, - это переопределить setData в подклассе элемента:
void MyItem::setData(int column, int role, const QVariant& value)
{
const bool isCheckChange = column == 0
&& role == Qt::CheckStateRole
&& data(column, role).isValid() // Don't "change" during initialization
&& checkState(0) != value;
QTreeWidgetItem::setData(column, role, value);
if (isCheckChange) {
MyTree *tree = static_cast<MyTree *>(treeWidget);
emit tree->itemCheckStateChanged(this, checkState(0) == Qt::Checked);
}
}
На самом деле было бы удобно иметь это в Qt, и это заставляет меня задуматься о том, как напрямую подать сигнал itemCheckStateChanged:)
PS: установка Qt:: ItemIsUserCheckable не требуется, этот флаг включен по умолчанию для всех QTreeWidgetItems.