2010-06-23 35 views
24

Tôi có QTableWidget và muốn nhấn CTRL trong khi nhấp vào tiêu đề cột sẽ đánh dấu toàn bộ cột. Để có được chỉ mục cột không phải là vấn đề vì có một phần Báo cáo cung cấp cho tôi chỉ mục hiện tại của cột được nhấp. Làm cách nào để tôi có thể nhận trạng thái của bất kỳ công cụ sửa đổi bàn phím nào khi cột được nhấp?Cách phát hiện phím bổ trợ khi nhấp chuột vào Qt

Trả lời

28

Hãy thử QApplication::keyboardModifiers() luôn có sẵn

Trên Qt 5, hãy thử QGuiApplication::keyboardModifiers().

+0

tôi tìm thấy nó allready – tfl

+0

NOW Tôi vấp ngã khi câu trả lời này! Sau khi tôi viết lại mọi thứ như một lớp phụ lộn xộn để tôi có thể nhận được đối tượng 'event' :-) D'oh! –

+0

Tương tự như @Freedom_Ben Tôi cũng đang xem xét tất cả các ví dụ cho thấy phân lớp phụ hoặc bộ lọc sự kiện ... nhưng nhờ sự kiên trì của tôi (có thể là sự lười biếng: P) mà tôi đã tìm thấy câu trả lời này. Làm việc như một sự quyến rũ ... Chính xác như tôi muốn! Cảm ơn Roku vì sự giúp đỡ của anh ấy! – zeFree

7

Trạng thái của các phím bổ trợ bàn phím có thể được tìm thấy bằng cách gọi hàm modifiers(), được kế thừa từ QInputEvent.

http://doc.qt.io/qt-5/qmouseevent.html

+0

Tôi biết nhưng tôi không có đối tượng bên trong khe liên quan đến sectionPressed khác sau đó chỉ số cột. Không có sự kiện, không có người gửi, không có gì. – tfl

+0

Có thể bạn có thể lưu trạng thái của trình sửa đổi trong mouseReleaseEvent sẽ xảy ra trước tín hiệu. –

3

này thực sự gây phiền nhiễu, tôi phải cài đặt một eventFilter và loại bỏ các sectionPressed handler

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

Trong eventFilter tôi có thể kiểm tra thời tiết một phím được nhấn như vậy

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); 
} 
2

Điều này phù hợp với tôi.

if (QApplication::keyboardModifiers().testFlag(Qt::ControlModifier) == true) { 
4

Bạn có thể sử dụng QGuiApplication::queryKeyboardModifiers() đó là đơn giản để sử dụng:

if(QGuiApplication::queryKeyboardModifiers().testFlag(Qt::ShiftModifier)) 
{ 
    // Do a few things 
} 
Các vấn đề liên quan