Виталий Антипов
Виталий АнтиповҚаз. 3, 2018, 3:03 Т.Қ.

Проблема с QML Popup

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

Item {   
    Connections {
        target: but_thread
        onSendToQml: {
            but_name = button_name
           ...
//обработка нажатий физических клавиш в случае открытого Popup-меню
            if(contextMenu.opened === true){
            if(but_name=="cancel"){
                contextMenu.close()
            }
            if(but_name=="ok"){
                if(contextMenu.index===0) but_create.clicked()
                if(contextMenu.index===1) but_edit.clicked()
                if(contextMenu.index===2) but_del.clicked()
            }
            if(but_name=="down"){
                if(contextMenu.index>-1 && contextMenu.index<3) contextMenu.index++
                if(contextMenu.index==3) contextMenu.index=0
            }
            if(but_name=="up"){
                if(contextMenu.index>-1 && contextMenu.index<3) contextMenu.index = contextMenu.index - 1
                if(contextMenu.index==-1) contextMenu.index=2
            }
            }
//обработка нажатий физических клавиш в случае открытого второго Popup-окна
            if(pop_create_database.opened === true){
            if(but_name=="cancel"){
                pop_create_database.close()
            }
            if(but_name=="ok"){
                if(pop_create_database.index===0) but_create_database.clicked() //если здесь добавить pop_create_database.close(), то pop_create_database не откроется через but_create.clicked()
                if(pop_create_database.index===1) but_cancel.clicked()
            }
            if(but_name=="down"){
                if(pop_create_database.index>-1 && pop_create_database.index<2) pop_create_database.index++
                if(pop_create_database.index==2) pop_create_database.index=0
            }
            if(but_name=="up"){
                if(pop_create_database.index>-1 && pop_create_database.index<2) pop_create_database.index = pop_create_database.index - 1
                if(pop_create_database.index==-1) pop_create_database.index=1
            }
            }
        }
    }
    Popup {
        id: contextMenu
        x: win.width/2 - width/2
        y: 200
        width: but_edit.width + 20
        height: but_create.height + but_edit.height + but_del.height + 40
        property int index: 0
        Column {
            anchors.centerIn: parent
            spacing: 10
            Button {
                id: but_create
                anchors.left: contextMenu.left
                width: but_edit.width
                text: "Создать базу данных"
                highlighted: contextMenu.index === 0 ? true : false
                onClicked: {
                    contextMenu.close()
                    pop_create_database.open()
                    contextMenu.index = 0
                }
            }
            Button {
                id: but_edit
                text: "Редактировать название базы"
                highlighted: contextMenu.index === 1 ? true : false
                onClicked: {
                    contextMenu.index = 1
                }
            }
            Button {
                id: but_del
                width: but_edit.width
                text: "Удалить базу"
                highlighted: contextMenu.index === 2 ? true : false
                onClicked: {
                    contextMenu.index = 2
                }
            }
        }
    }
    Popup {
        id: pop_create_database
        property int index: 0
        x: win.width/2 - width/2
        y: 120
        z: 10
        width: 300
        height: tf_create_database.height + but_create_database.height + but_cancel.height + 40
        focus: true
        closePolicy: Popup.NoAutoClose
        Column {
            anchors.centerIn: parent
            spacing: 10
            focus: true
            TextField {
                id: tf_create_database
                objectName: "tf_create_database"
                width: pop_create_database.width - 20
                placeholderText: "Введите название базы"
                focus: true
                Component.onCompleted: {
                    tf_create_database.focus = true
                }
            }
            Button {
                id: but_create_database
                anchors.horizontalCenter: tf_create_database.horizontalCenter
                width: 200
                highlighted: pop_create_database.index === 0 ? true : false
                text: "Создать"
                onClicked: {
                    qmlSignal_create_db()
                    db_list.updateModel()
                    pop_create_database.close() //вот если эту строку удалить, то все работает хорошо, но как тогда этот Popup закрыть?
                }
            }
            Button {
                id: but_cancel
                anchors.horizontalCenter: tf_create_database.horizontalCenter
                width: 200
                highlighted: pop_create_database.index === 1 ? true : false
                text: "Отмена"
                onClicked: {
                    pop_create_database.close()
                }
            }
        }
    }
}

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

Рекомендуем хостинг TIMEWEB
Рекомендуем хостинг TIMEWEB
Стабильный хостинг, на котором располагается социальная сеть EVILEG. Для проектов на Django рекомендуем VDS хостинг.

Ол саған ұнайды ма? Әлеуметтік желілерде бөлісіңіз!

2
Виталий Антипов
  • Қаз. 3, 2018, 3:26 Т.Қ.

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

    Виталий Антипов
    • Қаз. 3, 2018, 4:11 Т.Қ.
    • Жауап шешім ретінде белгіленді.

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

      Пікірлер

      Тек рұқсаты бар пайдаланушылар ғана пікір қалдыра алады.
      Кіріңіз немесе Тіркеліңіз
      Г

      C++ - Тест 001. Первая программа и типы данных

      • Нәтиже:66ұпай,
      • Бағалау ұпайлары-1
      t

      C++ - Тест 001. Первая программа и типы данных

      • Нәтиже:33ұпай,
      • Бағалау ұпайлары-10
      t

      Qt - Тест 001. Сигналы и слоты

      • Нәтиже:52ұпай,
      • Бағалау ұпайлары-4
      Соңғы пікірлер
      G
      GoattRockҚыр. 3, 2024, 1:50 Т.Қ.
      Linux жүйесінде файлдарды қалай көшіруге болады Задумывались когда-нибудь о том, как мы привыкли доверять свои вещи службам грузоперевозок? Сейчас такие услуги стали неотъемлемой частью нашей жизни, особенно когда речь идет о переездах между …
      d
      dblas5Шілде 5, 2024, 11:02 Т.Ж.
      QML - Сабақ 016. SQLite деректер қоры және онымен QML Qt-та жұмыс істеу Здравствуйте, возникает такая проблема (я новичок): ApplicationWindow неизвестный элемент. (М300) для TextField и Button аналогично. Могу предположить, что из-за более новой верси…
      k
      kmssrАқп. 8, 2024, 6:43 Т.Қ.
      Qt Linux - Сабақ 001. Linux астында Autorun Qt қолданбасы как сделать автозапуск для флэтпака, который не даёт создавать файлы в ~/.config - вот это вопрос ))
      АК
      Анатолий КононенкоАқп. 5, 2024, 1:50 Т.Ж.
      Qt WinAPI - Сабақ 007. Qt ішінде ICMP Ping арқылы жұмыс істеу Без строки #include <QRegularExpressionValidator> в заголовочном файле не работает валидатор.
      Енді форумда талқылаңыз
      Evgenii Legotckoi
      Evgenii LegotckoiМаусым 24, 2024, 3:11 Т.Қ.
      добавить qlineseries в функции Я тут. Работы оень много. Отправил его в бан.
      F
      FynjyШілде 22, 2024, 4:15 Т.Ж.
      при создании qml проекта Kits есть но недоступны для выбора Поставил Qt Creator 11.0.2. Qt 6.4.3 При создании проекта Qml не могу выбрать Kits, они все недоступны, хотя настроены и при создании обычного Qt Widget приложения их можно выбрать. В чем может …
      BlinCT
      BlinCTМаусым 25, 2024, 1 Т.Ж.
      Нарисовать кривую в qml Всем привет. Имеется Лист листов с тосками, точки получаны интерполяцией Лагранжа. Вопрос, как этими точками нарисовать кривую? ChartView отпадает сразу, в qt6.7 появился новый элемент…
      BlinCT
      BlinCTМамыр 5, 2024, 5:46 Т.Ж.
      Написать свой GraphsView Всем привет. В Qt есть давольно старый обьект дял работы с графиками ChartsView и есть в 6.7 новый но очень сырой и со слабым функционалом GraphsView. По этой причине я хочу написать х…
      Evgenii Legotckoi
      Evgenii LegotckoiМамыр 2, 2024, 2:07 Т.Қ.
      Мобильное приложение на C++Qt и бэкенд к нему на Django Rest Framework Добрый день. По моему мнению - да, но то, что будет касаться вызовов к функционалу Андроида, может создать огромные трудности.

      Бізді әлеуметтік желілерде бақылаңыз