2016-09-14 6 views
1

Я использую MouseArea для кнопок в своем приложении QT и должен знать, когда пользователь пальцем нажимает на кнопку. На W7 с помощью мыши я получаю эту информацию с помощью OnEntered from MouseArea.Как получить сигнал Qt, введенный() в MouseArea от Touch?

Проблема: на целевой платформе с сенсорным экраном введенный сигнал активируется, когда я нажимаю MouseArea (сначала коснитесь внутри MouseArea), затем вытащите палец (выведенный сигнал), затем переместите палец назад в (введенный сигнал). Но когда первое касание находится за пределами области, и я вхожу в него, входной сигнал не запускается. Я также пробовал MultiPointTouchArea с onTouchUpdated и onUpdated, такое же поведение.

Я использую Qt 5.5.1 на встроенном Linux.

Есть ли что-то, что я могу сделать, чтобы MouseArea всегда запускал введенный сигнал? Или я должен использовать что-то другое, кроме MouseArea или MultiPointTouchArea?

В качестве обходного решения я мог бы подумать о MouseArea в полном окне с информацией о том, где находятся все кнопки, и проверять каждую позицию, если была введена кнопка, но я уверен, что должно быть лучшее решение.

Редактирование: при использовании мыши на целевой платформе введенный сигнал запускается при перемещении мыши в область.

Это моя (упрощенный) код:

main.cpp

#include <QApplication> 
#include <QQmlApplicationEngine> 
#include <QQmlContext> 
#include <QtQml> 

#include "uart_terminal.h" 

int main(int argc, char *argv[]) 
{ 
    system("mount /dev/mmcblk0p1 /mnt/sdcard/"); 
    setenv("QT_QPA_EGLFS_PHYSICAL_WIDTH", "376", 1); 
    setenv("QT_QPA_EGLFS_PHYSICAL_HEIGHT", "301", 1); 

    QApplication app(argc, argv); 
    qmlRegisterType<UART_terminal>("com.uart", 1, 0, "UARTTerminal"); 

    QQmlApplicationEngine engine; 
    engine.rootContext()->setContextProperty("applicationDirPath", QGuiApplication::applicationDirPath()); 
    engine.load(QUrl(QStringLiteral("qrc:/main.qml"))); 

    return app.exec(); 
} 

main.qml:

Window 
    { 
     id: rootWindow 
     visible: true 

     width: 1280 
     height: 1024 

     Rectangle 
     { 
      id: test 
      color: "red" 
      width: 300 
      height: 300 

      MouseArea 
      { 
       anchors.fill: parent 

       hoverEnabled: true 
       acceptedButtons: Qt.AllButtons 

       onEntered: 
       { 
        console.log("entered") 
        test.color = "blue" 
       } 
       onExited: test.color = "red" 
       onCanceled: console.log("canceled") 
       onPositionChanged: 
       { 
        console.log("pos changed, containsMouse", containsMouse) 
       } 
      } 

      /*MultiPointTouchArea 
      { 
       anchors.fill: parent 
       onTouchUpdated: console.log("touch updated") 
       onUpdated: console.log("touchlist updated") 
      }*/ 
     } 
    } 

ответ

0

Так как я не нашел другого решения, я должен был реализовать упомянутую работу. Я положил MouseArea «buttonContainer» на весь экран, за всеми остальными MouseAreas. Обратите внимание, что мне приходится распространять сигнал positionChanged от каждого MouseArea, иначе он не будет создавать мой введенный в действие сигнал, когда я запустил сенсорную кнопку одним нажатием, а затем введите другой.

onPositionChanged: 
{ 
    // propagate event to buttonContainer with absolute mouse position 
    var position = roundMouseArea.mapToItem(root) 
    buttonContainer.xOffsetMouse = position.x 
    buttonContainer.yOffsetMouse = position.y 
    buttonContainer.positionChanged(mouse) 
} 

Тогда в onPositionChanged buttonContainer, я должен проверить все кнопки, которые видны, если на данный момент реализованы они были введены. Не забудьте снова отобразить каждую позицию кнопок с помощью btn.mapToItem (buttonContainer) и сбросить x- и yOffsetMouse в buttonContainer onPressed.

В моем случае я должен был сделать гораздо больше вещей, как

  • проверки, если кнопка отключена в любом случае, хотя видно
  • запомнить enteredBtn
  • набор BOOL для каждой кнопки, если он уже поступил из моего контейнера , поэтому я не получаю входной сигнал в каждой позиции. Замечено, пока я остаюсь в этой кнопке.
  • также проверить, что кнопка вышла
  • set btnПредует true или false соответственно, например. Также в buttonContainer-х onReleased
  • сброса enteredBtn к неопределенным соответственно и проверить, что перед ссылкой на любой метод или свойство enteredBtn (например, при onReleased buttonContainer в)

Я думаю, что все.Не хотите копировать весь мой код здесь, просто укажите некоторые аспекты, которые вам также могут потребоваться, если у вас есть такая же проблема.

Смежные вопросы