如何检测鼠标单击时的修饰键

问题描述 投票:0回答:5

我有一个

QTableWidget
,希望在单击列标题时按 Ctrl 标记整个列。

获取列索引不是问题,因为有一个

sectionPressed
信号,它为我提供了单击的列的当前索引。

单击列时如何获取任何键盘修饰符的状态?

qt qtablewidget mouseclick-event modifier-key
5个回答
40
投票

在 Qt 4 上,尝试

QApplication::keyboardModifiers()

Qt 5 的等效项是

QGuiApplication::keyboardModifiers()


13
投票

如果您想通过鼠标单击事件了解修饰键状态,可以使用 QGuiApplication::keyboardModifiers() 它将检索上次鼠标事件期间的键状态:

if(QGuiApplication::keyboardModifiers().testFlag(Qt::ControlModifier)) {
    // Do a few things
}

否则,如果您想显式查询修饰符状态,您应该使用 QGuiApplication::queryKeyboardModifiers()。这在其他用例中可能是必需的,例如在应用程序启动期间检测修饰键。


11
投票

来自 Qt 文档 — QMouseEvent 类

可以通过调用继承自QInputEvent的modifiers()函数来找到键盘修饰键的状态。


4
投票

我必须安装

eventFilter
并删除
sectionPressed
处理程序:

ui->tableWidget->horizontalHeader()->viewport()->installEventFilter(this);

eventFilter
中,我可以检查是否按下了某个键,如下所示:

bool MainWindow::eventFilter(QObject *object, QEvent *event)
{
    if(event->type() == QEvent::MouseButtonPress)
    {
        if(Qt::ControlModifier == QApplication::keyboardModifiers())
        {
            QMouseEvent *mouseEvent = static_cast<QMouseEvent *>(event);
            if(mouseEvent)
            {
                if(mouseEvent->button()== Qt::LeftButton)
                {
                    ui->tableWidget->selectColumn(ui->tableWidget->itemAt(mouseEvent->pos())->column());
                    return true;
                }
            }
        }
    }

    return QWidget::eventFilter(object,event);
}

3
投票
if (QApplication::keyboardModifiers().testFlag(Qt::ControlModifier) == true) {
© www.soinside.com 2019 - 2024. All rights reserved.