QTableWidget单元格相关信号

通过一段代码详细说明QTableWidget的单元格被点击(包括单击和双击)以及内容被编辑时,发出的相关信号
(1)主要有 cellChanged,cellActivated,cellClicked,cellDoubleClicked,cellEntered,cellPressed以及相应的item类信号
(2)各个信号发出的时机
(3)信号发出的先后

通过以下代码,详尽地探索了,点击一个单元格,到点击另外一个单元格之间,到底Qt背后做了哪些事情。


MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
{
    this->resize(500,300);
    QTableWidget* table=new QTableWidget(3,5);
    //开启表格的鼠标跟踪
    table->setMouseTracking(true);
    this->init_table(table);
    this->setup_connections(table);
    this->setup_connections2(table);
    this->setup_connections3(table);
    this->setCentralWidget(table);
}

void MainWindow::init_table(QTableWidget *table)
{
    //对表格进行了初始化之后,就无需再双击使得表格被编辑之后,单击单元格发出信号:QTableWidget::itemClicked
    for(int i=0;i<table->rowCount();i++)
    {
        for(int j=0;j<table->columnCount();j++)
        {
            table->setItem(i,j,new QTableWidgetItem(""));
        }
    }
}

void MainWindow::setup_connections(QTableWidget *table)
{
    //当前单元格按下enter键时,发出该信号
    connect(table,&QTableWidget::cellActivated,[=](int row,int col){
        qDebug()<<"QTableWidget::cellActivated"<<row<<","<<col;
    });
    //修改了单元格的内容,发出该信号,
    //内容修改指的是数据提交给model还是cell?
    connect(table,&QTableWidget::cellChanged,[=](int row,int col){
        qDebug()<<"QTableWidget::cellChanged"<<row<<","<<col;
    });

    //单击单元格进行选择的时候会发出该信号
    //单击信号是在松开鼠标左键的时候发出的,
    //点击单元格创建选区的过程也会有一个点击的动作,但是如果选区的结束单元格不在点击的单元格,不会发出该信号
    connect(table,&QTableWidget::cellClicked,[=](int row,int col){
        qDebug()<<"QTableWidget::cellClicked"<<row<<","<<col;
    });

    //双击单元格信号发出之前一定会发出一个单击单元格的信号
    //默认右键双击也会发出该信号,但是右键双击不会发出单击信号
    connect(table,&QTableWidget::cellDoubleClicked,[=](int row,int col){
        qDebug()<<"QTableWidget::cellDoubleClicked"<<row<<","<<col;
    });

    //(1)开启了表格的鼠标跟踪的情况下,鼠标移入到单元格内立即发出该信号
    //(2)不开启表格的鼠标跟踪的情况下:
    //鼠标左键或者右键按下,并且开始移动(拖动)时发出该信号
    //鼠标每进入一个单元格就会发出一次该信号
    connect(table,&QTableWidget::cellEntered,[=](int row,int col){
        qDebug()<<"QTableWidget::cellEntered"<<row<<","<<col;
    });

    //单击单元格的时候发出,与cellClicked不同,它是在鼠标左键或者右键按下的时候就已经发出
    connect(table,&QTableWidget::cellPressed,[=](int row,int col){
        qDebug()<<"QTableWidget::cellPressed"<<row<<","<<col;
    });


}

void MainWindow::setup_connections2(QTableWidget *table)
{
    //===================================================================
    //通过单击一个单元格来时选中状态切换到当前单元格时,
    //顺序:
    //currentCellChanged   ->   itemSelectionChanged   -> cellPressed

    //如果通过键盘方向键来移动选中,顺序:
    //itemSelectionChanged  -> currentCellChanged


    connect(table,&QTableWidget::currentCellChanged,[=](int crow,int ccol,int prow,int pcol){
        qDebug()<<"QTableWidget::currentCellChanged("<<crow<<","<<ccol<<")<-("<<prow<<","<<pcol<<")";
    });

    //该信号是当前选中的单元格切换时发出,
    //但是如果当前单元格没有被编辑过,即它的QTableWidgetItem为nullptr
    //两个没有被编辑过的单元格之间切换选中状态时不会发出以下信号
    //从一个被编辑过的单元格切换到一个没有被编辑过的单元格,或者从一个没有被编辑过的单元格切换到一个编辑过的单元格会发出该信号
    connect(table,&QTableWidget::currentItemChanged,[=](QTableWidgetItem *current, QTableWidgetItem *previous){
        qDebug()<<"QTableWidget::currentItemChanged"<<current<<"<-"<<previous;
    });

    //点击一个编辑过的单元格,发出该信号
    //点击一个没有被编辑过的单元格,即它的QTableWidgetItem为nullptr,不会发出该信号
    //与cellClicked一样,在鼠标抬起时发出信号
    connect(table,&QTableWidget::itemClicked,[=](QTableWidgetItem *item){
        qDebug()<<"QTableWidget::itemClicked:"<<item;
    });

    //点击一个编辑过的单元格,发出该信号
    //点击一个没有被编辑过的单元格,即它的QTableWidgetItem为nullptr,不会发出该信号
    //与cellPressed一样,在鼠标按下时发出信号
    connect(table,&QTableWidget::itemPressed,[=](QTableWidgetItem *item){
        qDebug()<<"QTableWidget::itemPressed:"<<item;
    });

    connect(table,&QTableWidget::itemSelectionChanged,[=](){
        qDebug()<<"QTableWidget::itemSelectionChanged";
    });
}

void MainWindow::setup_connections3(QTableWidget *table)
{
    //这里信号写成QTableView::是因为以下信号都是从QTableView继承来的

    //同QTableWidget::cellActivated,在当前单元格按下enter时发出该信号
    connect(table,&QTableView::activated,[=](const QModelIndex &index){
        qDebug()<<"QTableView::activated"<<index;
    });

    //点击单元格(鼠标按键抬起)发出,并且在QTableWidget::cellClicked之后发出
    connect(table,&QTableView::clicked,[=](const QModelIndex &index){
        qDebug()<<"QTableView::clicked"<<index;
    });

    //鼠标行为同QTableWidget::cellDoubleClicked
    //在QTableWidget::cellDoubleClicked之后发出
    connect(table,&QTableView::doubleClicked,[=](const QModelIndex &index){
        qDebug()<<"QTableView::doubleClicked"<<index;
    });

    //鼠标行为同 QTableWidget::cellEntered
    //在QTableWidget::cellEntered之后发出
    connect(table,&QTableView::entered,[=](const QModelIndex &index){
        qDebug()<<"QTableView::entered"<<index;
    });

    //点击单元格(按键按下)发出,并且在QTableWidget::cellPressed之后发出
    connect(table,&QTableView::pressed,[=](const QModelIndex &index){
        qDebug()<<"QTableView::pressed"<<index;
    });

    //该信号只有在table->setMouseTracking(true);情况下才会发出
    //在鼠标从窗口外移入到表格的窗口(不包含有单元格的区域)上发出该信号
    connect(table,&QTableView::viewportEntered,[=](){
        qDebug()<<"QTableView::viewportEntered";
    });
}

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值