C++ 捕获QTableWidgetItem检查状态更改

C++ 捕获QTableWidgetItem检查状态更改,c++,qt,qt4,C++,Qt,Qt4,我有一个QTableWidget,上面有一些QtableWidgetSites。有些项目使用复选框。我使用以下代码添加了复选框: QTableWidgetsItem->setCheckState(Qt::Checked); 现在我想在复选框状态更改时调用一些函数。例如,使用信号 实现这一点最简单的方法是什么?最简单的方法是在包含QTableWidget的类中使用插槽捕获QTableWidget的信号。虽然看起来QTableWidget::itemsactivated可能是我们的最佳选择,

我有一个QTableWidget,上面有一些QtableWidgetSites。有些项目使用复选框。我使用以下代码添加了复选框:

QTableWidgetsItem->setCheckState(Qt::Checked);
现在我想在复选框状态更改时调用一些函数。例如,使用信号


实现这一点最简单的方法是什么?

最简单的方法是在包含QTableWidget的类中使用插槽捕获QTableWidget的信号。虽然看起来
QTableWidget::itemsactivated
可能是我们的最佳选择,但不确定当
Qt::CheckState
等于
Qt::Checked
时是否会发出此消息。此外,即使这是真的,该信号也不会为您提供处理应用程序可能需要执行的项目取消选中的功能

所以,这里是我提出的解决方案。捕获
QTableWidget::itemPressed
QTableWidget::itemClicked
信号,其中包含QTableWidget的类中定义了插槽。由于itemPressed应在释放鼠标按钮之前调用,itemClicked应在释放鼠标按钮之后调用,因此该QTableWidgetItem的Qt::CheckState应仅在这两个信号发射之间设置。因此,您可以准确地确定QTableWidgetItem的checkState何时以较低的内存开销更改

下面是这些插槽的示例:

void tableItemPressed(QTableWidgetItem * item)
{
    // member variable used to keep track of the check state for a 
    // table widget item currently being pressed
    m_pressedItemState = item->checkState();
}

void tableItemClicked(QTableWidgetItem * item)
{
    // if check box has been clicked
    if (m_pressedItemState != item->checkState())
    {
        // perform check logic here
    }
}
信号/插槽的连接方式如下:

connect(m_tableWidget,SIGNAL(itemPressed(QTableWidgetItem *)),this,SLOT(tableItemPressed(QTableWidgetItem *)));
connect(m_tableWidget,SIGNAL(itemClicked(QTableWidgetItem *)),this,SLOT(tableItemClicked(QTableWidgetItem *)));

其中
m_tableWidget
是与表格小部件关联的
QTableWidget*

此示例不考虑按空格键进行选中/取消选中的可能性。你可以用手机信号来修复它。