当我点击一个单元格或使用箭头键导航到QTableView的新单元格时,我希望发出一个信号。当我使用QTableWidget时,我使用了currentCellChanged信号。但是,我在QTableView中没有看到类似的信号 - 是否有类似的东西?
谢谢,
大卫
答案 0 :(得分:4)
您可以使用:
currentChanged(QModelIndex, QModelIndex)
返回的QItemSelectionModel
实例的信号QAbstractItemView::selectionModel()
,或QAbstractItemView::currentChanged(QModelIndex, QModelIndex)
。 PS:当参数是const引用时(单独不const
,或者不单独&
),您可以省略const
和&
中的SIGNAL
和SLOT
{1}}和connect(tableView->selectionModel(),
SIGNAL(currentChanged(QModelIndex, QModelIndex)),
...
宏:
{{1}}
答案 1 :(得分:0)
您应该重新实现此method:
virtual void selectionChanged ( const QItemSelection & selected, const QItemSelection & deselected )
答案 2 :(得分:0)
似乎没有像QTableWidget的currentCellChanged那样简洁,但QTableView确实继承了QAbstractItemView中你可以一起使用的一些东西,特别是点击,输入和&用于鼠标输入的按下信号,以及用于键盘输入的keyPressEvent。我能看到的唯一真正的问题是那些依赖于你的人也使用模型,因为它完全基于模型的当前索引是有效的。
答案 3 :(得分:0)
您还可以使用事件过滤器并重新实现eventFilter来管理索引更改,如下所示:
MyWidget::MyWidget(QWidget* parent) : QWidget(parent), ui(new Ui::uiClass)
{
ui->setupUi(this);
ui->tableView->installEvenFilter(this);
connect( ui->tableView, SIGNAL(activated(QModelIndex)), this,SLOT(manageNewIndex(QModelIndex)));
}
bool MyWidget::eventFilter(QObject* watched, QEvent* event)
{
bool retVal = true;
if(watched == ui->tableView && event->type() == QEvent::KeyPress)
{
QModelIndex index = ui->tableView->currentIndex();
int row = index.row();
int col = index.column();
if(((QKeyEvent*)event)->key() == Qt::Key_Down)
{
index = index.sibling(row+1,col);
}else if(((QKeyEvent*)event)->key() == Qt::Key_Up)
{
index = index.sibling(row-1,col);
}
if(index.isValid())
{
ui->tableView->setCurrentIndex(index);
manageNewIndex(index);
}
retVal = true;
}
else
retVal = QWidget::eventFilter(watched,event);
return retVal;
}