类似于QTableView中的QTableWidget :: currentCellChanged?

时间:2011-11-02 21:36:27

标签: qt qt4

当我点击一个单元格或使用箭头键导航到QTableView的新单元格时,我希望发出一个信号。当我使用QTableWidget时,我使用了currentCellChanged信号。但是,我在QTableView中没有看到类似的信号 - 是否有类似的东西?

谢谢,

大卫

4 个答案:

答案 0 :(得分:4)

您可以使用:

  • currentChanged(QModelIndex, QModelIndex)返回的QItemSelectionModel实例的信号QAbstractItemView::selectionModel(),或
  • 派生视图并重新定义函数QAbstractItemView::currentChanged(QModelIndex, QModelIndex)

PS:当参数是const引用时(单独不const,或者不单独&),您可以省略const&中的SIGNALSLOT {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;
}