将QTableWidget单元格与单元格中心的小部件同步

将QTableWidget单元格与单元格中心的小部件同步,qt,qtablewidget,qt-signals,qcheckbox,Qt,Qtablewidget,Qt Signals,Qcheckbox,我在QTableWidgetCell QWidget *widget = new QWidget(); QCheckBox *checkBox = new QCheckBox(); QHBoxLayout *layout = new QHBoxLayout(widget); layout->addWidget(checkBox); layout->setAlignment(Qt::AlignCenter); layout->setContentsMargins(0, 0, 0,

我在
QTableWidgetCell

QWidget *widget = new QWidget();
QCheckBox *checkBox = new QCheckBox();
QHBoxLayout *layout = new QHBoxLayout(widget);
layout->addWidget(checkBox);
layout->setAlignment(Qt::AlignCenter);
layout->setContentsMargins(0, 0, 0, 0);
widget->setLayout(layout);
table->setCellWidget(0, 0, widget);
此代码的结果是一个单元格,其中心带有复选框


我需要对鼠标在空白区域的移动和单击做出复选框反应,就像光标在复选框下一样。

如果您不想要
QCheckBox
的完整功能,而只是复选标记,您可以使用一个简单的
QTableWidgetItem
来修改他的选中状态

QTableWidgetItem* item = new QTableWidgetItem();
item->setCheckState(Qt::Unchecked);
table->setItem ( 0, 0, item );

connect(table, SIGNAL(cellClicked(int , int )), this, SLOT(OnClicked( int, int)));


void OnClicked( int row, int column )
{
   if(row != checkablelerow && col != checkablelecol )
     return; // or do something else

   item = table->item(row, column);

   item->setCheckState(item->checkState() == Qt::Checked ? Qt::Unchecked : Qt::Checked);
}

现在整个细胞都可以检查了。代码可能需要细化。

当光标进入单元格时,可以重写eventFilter方法以突出显示复选框

并使用QTableWidgetItem*的单击窗口将复选框设置为选中

void QTableWidgetItemClicked( int row, int column )
{
    QCheckBox* qcb = QObject::sender()->findChild<QCheckBox*>();
    qcb->setChecked(!qcb->isChecked());
}
void QTableWidgetItemClicked(int行,int列)
{
QCheckBox*qcb=QObject::sender()->findChild();
qcb->setChecked(!qcb->isChecked());
}

请记住将QTableWidgetItems信号连接到插槽。

能否提供有关预期行为的更多详细信息?我不明白什么是完整功能。我需要的是当光标在空白区域时复选框高亮显示,当lmb关闭时复选框处于按下状态。我之所以说完整功能,是因为复选框是一个
QAbstractButton
(一个Qwidget)
if(qobject\u cast(object))
-错误C2039:“qt\u metacall”:不是我替换为dynamic\u cast的“QTableWidgetItem”的成员。现在它已编译,但不起作用。
 widget->installEventFilter(this); //this points to parent of the widget, the exampleDialog
void QTableWidgetItemClicked( int row, int column )
{
    QCheckBox* qcb = QObject::sender()->findChild<QCheckBox*>();
    qcb->setChecked(!qcb->isChecked());
}