2015-08-16 19 views
8

Trước hết, tôi muốn đề cập đến rằng tôi thấy rằng bài đăng có liên quan How to get the mouse position on the screen in Qt? nhưng nó "không hoạt động" đối với tôi. Tôi đã thực hiện một số thử nghiệm và kết quả không hoạt động như tôi mong đợi, vì vậy tôi quyết định tạo một bài đăng mới để nói về bài kiểm tra tôi đã thực hiện và tìm giải pháp thay thế.Qt 5, nhận vị trí chuột trên màn hình

Đó là đoạn code tôi sử dụng để làm các xét nghiệm:

QScreen *screen0 = QApplication::screens().at(0); 
QScreen *screen1 = QApplication::screens().at(1); 

printf("screen0 %s \n", screen0->name().toStdString().c_str()); 
printf("screen1 %s \n", screen1->name().toStdString().c_str()); 

// Position on first screen. 
QPoint pos0 = QCursor::pos(screen0); 

// Position on second screen. 
QPoint pos1 = QCursor::pos(screen1); 

printf("pos 0: %d, %d \n", pos0.x(), pos0.y()); 
printf("pos 1: %d, %d \n", pos1.x(), pos1.y()); 

// Get position without screen. 
QPoint pos = QCursor::pos(); 
printf("pos: %d, %d \n", pos.x(), pos.y()); 

gì tôi đã mong đợi, đó là chỉ có một màn hình sẽ trở lại một vị trí hợp lệ, kể từ khi con trỏ chỉ vào một màn hình, chứ không phải trên cả hai. Nhưng nó không phải là trường hợp, các vị trí cả hai (pos0pos1) có giá trị chính xác cùng, như chúng ta có thể thấy trên đầu ra:

screen0 DVI-D-0 
screen1 HDMI-0 
pos 0: 1904, 1178 
pos 1: 1904, 1178 
pos: 1904, 1178 

Kể từ khi vị trí cả hai có cùng một giá trị, tôi không thể biết tại màn hình nào là con trỏ. Tôi không biết nếu đó là một hành vi bình thường hoặc một lỗi, kể từ khi tài liệu hướng dẫn không nói những gì sẽ xảy ra khi đối số màn hình không phải là màn hình mà con chuột được.

Ý tưởng của tôi là mở/khởi chạy một ứng dụng (được thực thi bởi một daemon Qt phải phát hiện màn hình được chọn) đến màn hình có con chuột. Tôi biết rằng với libX11 có thể, bởi vì tôi đã làm điều đó trong quá khứ, nhưng tôi cần phải làm việc với Qt 5, và tôi không thể tìm ra cách để phát hiện màn hình được chọn với Qt.

Tôi cũng đã thực hiện các thử nghiệm khác, sử dụng các lớp học QApplicationQDesktopWidget không có may mắn.

+0

Bạn đang sử dụng máy tính để bàn ảo? Một đầu kép? – peppe

Trả lời

3

Điều đó thực sự kỳ lạ. Là một khắc phục, bạn có thể thử này:.

QPoint globalCursorPos = QCursor::pos(); 
int mouseScreen = qApp->desktop()->screenNumber(globalCursorPos); 

Bây giờ bạn biết được màn hình con trỏ là trong Sau đó, bạn có thể tìm thấy vị trí con trỏ trong màn hình mà làm điều này:

QRect mouseScreenGeometry = qApp->desktop()->screen(mouseScreen)->geometry(); 
QPoint localCursorPos = globalCursorPos - mouseScreenGeometry.topLeft(); 
+0

Tôi đã thử điều đó, nhưng allways trả về màn hình 0.Ngay cả khi bạn lấy điểm từ màn hình 1 (với pos (QScreen *)), nó trả về 0. – armitage

+0

Bạn đang sử dụng Windows? Nó hoạt động ở đây trên Windows 10. –

+0

Tôi đang sử dụng Getoo, với KDE và Awesome làm trình quản lý cửa sổ. Có lẽ đó là một vấn đề cấu hình. Rafael, bạn có thể chia sẻ đầu ra và mã bạn đã thực thi không? – armitage

0

Sice có vẻ như nó không thể được thực hiện với Qt (ít nhất là với cấu hình hệ thống của tôi, và có vẻ như cũng trong Windows), tôi quyết định sử dụng libX11 để thực hiện việc đó, hoạt động như sự quyến rũ.

Đây không phải là giải pháp lý tưởng vì tôi chỉ muốn sử dụng Qt, nhưng nó hoạt động.

2

Để tìm ra bạn đang ở màn hình nào, bạn có thể lặp qua số QGuiApplication::screens() và kiểm tra xem con trỏ có vừa với geometry của màn hình hay không.

Dưới đây là một ví dụ phức tạp hơn để tính toán vị trí con trỏ bản địa (lưu ý việc bổ sung cần thiết để làm việc với màn hình cao DPI):

QPoint getNativeCursorPosition() 
{ 
    QPoint pos = cursorPosToNative(QCursor::pos()); 

    // Cursor positions from Qt are calculated in a strange way, the offset to 
    // the origin of the current screen is in device-independent pixels while 
    // the origin itself is native! 

    for (QScreen *screen : QGuiApplication::screens()) { 
     QRect screenRect = screen->geometry(); 
     if (screenRect.contains(pos)) { 
      QPoint origin = screenRect.topLeft(); 
      return origin + (pos - origin) * screen->devicePixelRatio(); 
     } 
    } 

    // should not happen, but try to find a good fallback. 
    return pos * qApp->devicePixelRatio(); 
} 
+0

trong mã này, tôi tin rằng cursorPos nên được đổi tên thành pos. – Dave

+0

@Dave Đã sửa, cảm ơn! – Lekensteyn

+0

Tôi cần tiêu đề nào cho hàm 'cursorPosToNative' này - nó dường như không tồn tại trong Qt 5.9.3? – Vertigo

0

này có vẻ giống như một giải pháp tầm thường, nhưng trên KDE của tôi nó công trình (tôi đã gặp phải các vấn đề tương tự ban đầu). Nếu bạn muốn xác định chuột địa phương phối đối với một widget với (điều này sẽ được tính theo pixel và thiết bị liên quan đến góc trên bên trái của widget Tôi tin), bạn có thể sử dụng

QWidget::mapFromGlobal(QCursor::pos()); 

ví dụ: gọi this->mapFromGlobal.

Các vấn đề liên quan