2012-03-13 77 views
10

我使用下面的代码创建了一个也是QTreeWidgetItem的复选框。是否可以为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))); 

回答

4

QTreeWidgetItem是直接关系到你的模型数据,所以你应该连接到您的QTreeWidget的模型QAbstractItemModel::dataChanged信号被更改的通知。

+3

这是不正确的。 QTreeWidget没有用户模型。 – 2014-04-02 05:27:24

+0

@GHuxley但是你仍然可以连接到一个QTreeWidget的底层默认模型,例如'treeWidget.model()。dataChanged.connect(handle_dataChanged)'。不知道这是否比连接到'itemChanged'更好,但它看起来很相似。 – blah238 2016-12-16 01:21:54

6

您必须抓取来自QTreeWidget的信号itemChanged (QTreeWidgetItem * item, int column)

+1

这不好,因为它会随着树数据的变化而不断发出信号。 – 2014-04-02 05:32:03

3

连接到树的信号itemClicked(QTreeWidgetItem* item, int column)。处理信号时,只需验证item->checkState(column)

+0

当用户单击复选框时,不会发出信号。例如,用户点击该项目。然后点击复选框。 CheckState将不会在复选框点击调用。至少在Qt 5.3中是这样的。 – Chrismit 2014-09-15 19:51:53

+0

我现在在Mac和Win上都使用Qt 5.3.1。 – 2014-09-22 22:49:11

+0

这有效,但您必须根据自己的模型检查项目的选中状态以进行更改。 – kainjow 2015-04-30 15:49:40

3

我们发现最好的解决办法是重新实现使用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都是打开的。

相关问题