【问题标题】:Synchronize QTableWidget cell with widget in the center of the cell将 QTableWidget 单元格与单元格中心的小部件同步
【发布时间】:2014-10-10 11:50:31
【问题描述】:

我在QTableWidgetCell中使用QCheckBox

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

这段代码的结果是一个居中带有复选框的单元格。

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

【问题讨论】:

  • 您能否提供有关预期行为的更多详细信息?

标签: qt qtablewidget qt-signals qcheckbox


【解决方案1】:

如果您不想要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);
}

现在整个单元格都可以检查了。代码可能需要改进。

【讨论】:

  • 我不明白什么是成熟的功能。我需要的是当光标在空白区域复选框突出显示时,当 lmb 向下时复选框处于推送状态。
  • 我说功能齐全是因为复选框是QAbstractButton(一个Qwidget)
【解决方案2】:

当光标进入单元格时,您可以覆盖 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 信号连接到槽。

【讨论】:

  • if (qobject_cast&lt;QTableWidgetItem*&gt;(object)) - 错误 C2039: 'qt_metacall' : is not a member of 'QTableWidgetItem'
  • 我换成了dynamic_cast。现在它已编译但无法正常工作。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-03-09
  • 1970-01-01
  • 1970-01-01
  • 2021-02-01
  • 1970-01-01
相关资源
最近更新 更多