Виталий Антипов
Oct. 4, 2018, 1:03 a.m.

Проблема с QML Popup

Здравствуйте! Делаю портативный прибор для инженерных измерений, задача - обеспечить как сенсорное управления с экрана, так и управление интерфейсом физическими кнопками. Все шло хорошо, пока не задействовал Popup. Необходимо открыть Popup-меню, щелкнуть нужную кнопку, которая закроет это Popup-меню и вызовет другое Popup-окно. Проблема в следующем: если тыкать пальцем по кнопке Popup-меню на экране, то второй Popup открывается и все отлично, но если действовать физическими кнопками, то второй Popup открывается только при условии отсутствия метода его закрытия. Вот код:

  1. Item {
  2. Connections {
  3. target: but_thread
  4. onSendToQml: {
  5. but_name = button_name
  6. ...
  7. //обработка нажатий физических клавиш в случае открытого Popup-меню
  8. if(contextMenu.opened === true){
  9. if(but_name=="cancel"){
  10. contextMenu.close()
  11. }
  12. if(but_name=="ok"){
  13. if(contextMenu.index===0) but_create.clicked()
  14. if(contextMenu.index===1) but_edit.clicked()
  15. if(contextMenu.index===2) but_del.clicked()
  16. }
  17. if(but_name=="down"){
  18. if(contextMenu.index>-1 && contextMenu.index<3) contextMenu.index++
  19. if(contextMenu.index==3) contextMenu.index=0
  20. }
  21. if(but_name=="up"){
  22. if(contextMenu.index>-1 && contextMenu.index<3) contextMenu.index = contextMenu.index - 1
  23. if(contextMenu.index==-1) contextMenu.index=2
  24. }
  25. }
  26. //обработка нажатий физических клавиш в случае открытого второго Popup-окна
  27. if(pop_create_database.opened === true){
  28. if(but_name=="cancel"){
  29. pop_create_database.close()
  30. }
  31. if(but_name=="ok"){
  32. if(pop_create_database.index===0) but_create_database.clicked() //если здесь добавить pop_create_database.close(), то pop_create_database не откроется через but_create.clicked()
  33. if(pop_create_database.index===1) but_cancel.clicked()
  34. }
  35. if(but_name=="down"){
  36. if(pop_create_database.index>-1 && pop_create_database.index<2) pop_create_database.index++
  37. if(pop_create_database.index==2) pop_create_database.index=0
  38. }
  39. if(but_name=="up"){
  40. if(pop_create_database.index>-1 && pop_create_database.index<2) pop_create_database.index = pop_create_database.index - 1
  41. if(pop_create_database.index==-1) pop_create_database.index=1
  42. }
  43. }
  44. }
  45. }
  46. Popup {
  47. id: contextMenu
  48. x: win.width/2 - width/2
  49. y: 200
  50. width: but_edit.width + 20
  51. height: but_create.height + but_edit.height + but_del.height + 40
  52. property int index: 0
  53. Column {
  54. anchors.centerIn: parent
  55. spacing: 10
  56. Button {
  57. id: but_create
  58. anchors.left: contextMenu.left
  59. width: but_edit.width
  60. text: "Создать базу данных"
  61. highlighted: contextMenu.index === 0 ? true : false
  62. onClicked: {
  63. contextMenu.close()
  64. pop_create_database.open()
  65. contextMenu.index = 0
  66. }
  67. }
  68. Button {
  69. id: but_edit
  70. text: "Редактировать название базы"
  71. highlighted: contextMenu.index === 1 ? true : false
  72. onClicked: {
  73. contextMenu.index = 1
  74. }
  75. }
  76. Button {
  77. id: but_del
  78. width: but_edit.width
  79. text: "Удалить базу"
  80. highlighted: contextMenu.index === 2 ? true : false
  81. onClicked: {
  82. contextMenu.index = 2
  83. }
  84. }
  85. }
  86. }
  87. Popup {
  88. id: pop_create_database
  89. property int index: 0
  90. x: win.width/2 - width/2
  91. y: 120
  92. z: 10
  93. width: 300
  94. height: tf_create_database.height + but_create_database.height + but_cancel.height + 40
  95. focus: true
  96. closePolicy: Popup.NoAutoClose
  97. Column {
  98. anchors.centerIn: parent
  99. spacing: 10
  100. focus: true
  101. TextField {
  102. id: tf_create_database
  103. objectName: "tf_create_database"
  104. width: pop_create_database.width - 20
  105. placeholderText: "Введите название базы"
  106. focus: true
  107. Component.onCompleted: {
  108. tf_create_database.focus = true
  109. }
  110. }
  111. Button {
  112. id: but_create_database
  113. anchors.horizontalCenter: tf_create_database.horizontalCenter
  114. width: 200
  115. highlighted: pop_create_database.index === 0 ? true : false
  116. text: "Создать"
  117. onClicked: {
  118. qmlSignal_create_db()
  119. db_list.updateModel()
  120. pop_create_database.close() //вот если эту строку удалить, то все работает хорошо, но как тогда этот Popup закрыть?
  121. }
  122. }
  123. Button {
  124. id: but_cancel
  125. anchors.horizontalCenter: tf_create_database.horizontalCenter
  126. width: 200
  127. highlighted: pop_create_database.index === 1 ? true : false
  128. text: "Отмена"
  129. onClicked: {
  130. pop_create_database.close()
  131. }
  132. }
  133. }
  134. }
  135. }

Подскажите, как решить или обойти эту проблему?

1

Do you like it? Share on social networks!

2
Виталий Антипов
  • Oct. 4, 2018, 1:26 a.m.

Добавлю, вызов console.log(pop_create_database.opened) дает true... Popup открыт, но его не видно :(

    Виталий Антипов
    • Oct. 4, 2018, 2:11 a.m.
    • The answer was marked as a solution.

    Ух, извиняюсь. Увидел что при вызове второго Popup происходит запрос в базу по его кнопке. То есть Popup не успев прорисоваться получает клик по своей кнопке создания базы, вызывающей метод его закрытия. Поменял индексы и все заработало. Похоже что вместо одного нажатия физической кнопки ОК происходит несколько, хоть и ставил задержку 200 мс. Извиняюсь еще раз.

      Comments

      Only authorized users can post comments.
      Please, Log in or Sign up
      • Last comments
      • AK
        April 1, 2025, 11:41 a.m.
        Добрый день. В данный момент работаю над проектом, где необходимо выводить звук из программы в определенное аудиоустройство (колонки, наушники, виртуальный кабель и т.д). Пишу на Qt5.12.12 поско…
      • Evgenii Legotckoi
        March 9, 2025, 9:02 p.m.
        К сожалению, я этого подсказать не могу, поскольку у меня нет необходимости в обходе блокировок и т.д. Поэтому я и не задавался решением этой проблемы. Ну выглядит так, что вам действитель…
      • VP
        March 9, 2025, 4:14 p.m.
        Здравствуйте! Я устанавливал Qt6 из исходников а также Qt Creator по отдельности. Все компоненты, связанные с разработкой для Android, установлены. Кроме одного... Когда пытаюсь скомпилиров…
      • ИМ
        Nov. 22, 2024, 9:51 p.m.
        Добрый вечер Евгений! Я сделал себе авторизацию аналогичную вашей, все работает, кроме возврата к предидущей странице. Редеректит всегда на главную, хотя в логах сервера вижу запросы на правильн…
      • Evgenii Legotckoi
        Oct. 31, 2024, 11:37 p.m.
        Добрый день. Да, можно. Либо через такие же плагины, либо с постобработкой через python библиотеку Beautiful Soup