Qt获取键盘按键ctrl和alt以及shift按键按下和松开

.h文件中定义

/** 设置键盘按键状态 */
typedef enum
{
    KEY_STATE_Release = 0,   // 键盘按键状态Release
    KEY_STATE_Press,    // 键盘按键状态Press
}E_KEY_STATE;

E_KEY_STATE alt_key;
E_KEY_STATE ctrl_key;
E_KEY_STATE shift_key;
void keyPressEvent(QKeyEvent *event);
void keyReleaseEvent(QKeyEvent *event);

这里主要为了获取按键ctrl和alt以及shift按键按下和松开来达到对QTableWidget中的内容进行多选

//按键按下
void record::keyPressEvent(QKeyEvent *event)
{
    switch(event->key())
    {
        case Qt::Key_Alt:
            alt_key = KEY_STATE_Press;
            break;
        case Qt::Key_Control:
            ctrl_key = KEY_STATE_Press;
            break;

        case Qt::Key_Shift:
            shift_key = KEY_STATE_Press;
            break;
    }

    if((alt_key == KEY_STATE_Press && ctrl_key == KEY_STATE_Press) ||  shift_key == KEY_STATE_Press)
    {
        QList<QTableWidgetItem*> items1 = ui->tableWidget->selectedItems();
        if(!items1.isEmpty())
        {
            int count = items1.count();//获取该行的成员数
            int row = ui->tableWidget->row(items1.at(0));// 获取该行的行号
            
            for ( int i=0; i!=tabrow_nuamber.size(); ++i )
            {
                if ( tabrow_nuamber.at(i) == row )
                {
                    tabrow_nuamber.removeAt(i);
                    for(int t =0;t<count;t++)
                    {
                        QTableWidgetItem *item = items1.at(t);  //该行列的item
                        if(t == 1)
                        {
                            item->setText(" ");
                        }
                        item->setBackgroundColor(QColor(255,255,255));
                    }
                    return ;
                }
            }
            tabrow_nuamber.append(row);
            for(int i =0;i<count;i++)
            {
                QTableWidgetItem *item = items1.at(i);  //该行列的item
                item->setBackgroundColor(QColor(100,100,100));
                if(i == 1)
                {
                     item->setText("*");
                }
            }
            return ;
        }
    }
}
//按键松开
void record::keyReleaseEvent(QKeyEvent *event)
{
    switch(event->key())
    {
        case Qt::Key_Alt:
            alt_key = KEY_STATE_Release;
            break;
        case Qt::Key_Control:
            ctrl_key = KEY_STATE_Release;
            break;
        case Qt::Key_Shift:
            shift_key = KEY_STATE_Release;
            break;
    }
}

但是这引入了一个问题,那就是当前界面想要使用按键捕获,就需要在切换到该界面时调用:
grabKeyboard()
那么在这个例子中就是调用my_record->grabKeyboard();到达获取键盘的按键捕获
但是如果这个界面获取键盘捕获没有释放会导致其他界面不能正常获取键盘,不能输入
所以在切换至其他界面时需要调用my_record->releaseKeyboard();释放键盘捕获

但是使用grabKeyboard() 发现如果界面切换比较多,会导致有的界面不能正常通过键盘输入
所以最好的办法就是将keyReleaseEvent和keyPressEvent在主界面定义,然后发出信号在子界面进行处理


版权声明:本文为qq_40170041原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。