0

我用QCheckBoxQTableWidgetCell

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);

此代码的结果是一个在中心带有复选框的单元格。

我需要对鼠标移动和单击空白区域做出复选框反应,例如光标位于复选框下方时。

4

2 回答 2

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 信号连接到插槽。

于 2014-10-10T12:57:30.290 回答
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);
}

现在整个单元格将是可检查的。代码可能需要改进。

于 2014-10-10T12:06:39.797 回答