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

时间:2014-10-10 11:50:32

标签: qt qtablewidget qt-signals qcheckbox

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

此代码的结果是一个复选框位于中心的单元格。

我需要对鼠标移动进行复选框反应,然后单击空白区域,就像光标位于复选框下一样。

2 个答案:

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