Можно ли создать сигнал, когда флажок QTreeWidgetItem установлен?
-
13-12-2019 - |
Вопрос
Я создал флажок, который также является 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 )
приходящий из QTreeвиджет.
Подключиться к сигналу GenaCodicetacode дерева.При обращении с сигналом просто проверьте генеракодицетагкод.
Лучшее решение, которое мы нашли, было на наличие 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 действительно, это заставляет меня подумать о том, чтобы всом вклад личности сигнала на точке напрямую :)
PS: Установка Qt :: itemisuserCheckable не нужен, этот флаг по умолчанию по умолчанию для всех QtreewidetTems.