我在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, 0);
widget->setLayout(layout);
table->setCellWidget(0, 0, widget);
此代码的结果是一个复选框位于中心的单元格。
我需要对鼠标移动进行复选框反应,然后单击空白区域,就像光标位于复选框下一样。
答案 0 :(得分:0)
如果您不想要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);
}
现在整个单元格都可以检查。代码可能需要改进。
答案 1 :(得分:0)
当光标进入单元格时,您可以覆盖eventFilter方法以突出显示您的复选框。 http://qt-project.org/doc/qt-4.8/qobject.html#eventFilter
bool ExampleDialog::eventFilter(QObject *obj, QEvent *event)
{
if (qobject_cast<QTableWidgetItem*>(object)) {
if (event->type() == QEvent::HoverEnter) {
QCheckBox* qcb = object->findChild<QCheckBox*>();
//here you can do something to highlight your checkbox
return true;
}
else if(event->type() == QEvent::HoverLeave){
QCheckBox* qcb = object->findChild<QCheckBox*>();
//here you have to stop highlighting checkbox
return true;
}
else {
return false;
}
}
}
覆盖后,您必须在您的小部件上安装事件过滤器,如此
widget->installEventFilter(this); //this points to parent of the widget, the exampleDialog
使用QTableWidgetItem *的点击插槽来设置复选框。
void QTableWidgetItemClicked( int row, int column )
{
QCheckBox* qcb = QObject::sender()->findChild<QCheckBox*>();
qcb->setChecked(!qcb->isChecked());
}
请记住将QTableWidgetItems信号连接到插槽。