1

我有一个 QTableWidget 和 1 列只有复选框,所以对于这些项目我有这些标志:

/* create prototype for checkbox item */ 
checkItem = new QTableWidgetItem();
Qt::ItemFlags flags = checkItem->flags();
flags &= ~Qt::ItemIsEditable;
flags &= ~Qt::ItemIsDropEnabled;
flags &= ~Qt::ItemIsDragEnabled;
flags |= Qt::ItemIsUserCheckable;
checkItem->setFlags(flags);
/**/

好吧,这行得通……几乎。我不能在这些物品中放任何东西,这很好。但是现在可以在 2 个单元格之间放置,因此创建了一个新行。我怎样才能防止这种情况?在其他启用了单元格的列中,我只能放入单元格而不是介于两者之间,这很好。为什么当项目未启用拖放时此行为会更改?

4

1 回答 1

0

使用事件过滤器的快速破解(可能需要一些调整):

你这样做是忽略复选框列上的任何下降。所以禁用行创建应该足够了。

bool yourWidget::eventFilter(QObject *a_object, QEvent *a_event) 
  {
  bool result = false;
  if ((a_object == table->viewport()) && (a_event->type() == QEvent::Drop)) 
  {
     QDropEvent *p_drop_event = static_cast<QDropEvent *>(a_event);
     QPoint pos = p_drop_event->pos();
     QModelIndex new_index = table->indexAt(pos);
     if (new_index.column() == YOUR COLUMN HERE)
     {
       // Ignore drop event
       p_drop_event->setDropAction(Qt::IgnoreAction);
       p_drop_event->accept();
       return true;
     }
     else
     {
       // Allow drop
       return false;
     }

  }
return QObject::eventFilter(a_object, a_event);
}

有关事件过滤器的信息:

事件过滤器

于 2013-06-19T07:24:25.780 回答