QComboBox украсть фокус на всплывающем окне - PullRequest
0 голосов
/ 05 июня 2018

Там есть 2 программы Qt.

Одна из них - это нормальная программа, в которой есть QComboBox, это не я проектирую

Я создаю другую, после запуска она скрывается и, если удерживать нажатой KEY_POWER 2 секунды, пока она не появится, вы можете нажать KEY_TAB / KEY_LEFT / KEY_DOWN переместить фокус между двумя кнопками.

Кстати.Чтобы получить ввод с клавиатуры при сокрытии, мой метод читается из / dev / input / event0 в потоке, если чтение KEY_POWER через 2 с показывает его.

void *ThreadMinitorKey(void *arg)
{
    struct input_event key_event;

    fd = open("/dev/input/event0", O_RDONLY);

    while(1) {
        len = read(fd, &key_event, sizeof(key_event));
        if (len != -1 && key_event.type == EV_KEY) {
            if (press_KEW_POWER_2_sec()) {
                g_dialog->show();
            }
        }
    }
}

Запустите хорошо

enter image description here фокус на QComoBox

enter image description here нажмите клавиатуру KEY_POWER 2 секунды моего окна, фокус на левой кнопке.Внимание к QComboBox, его фон от синий до белый .

enter image description here нажмите KEY_LEFT / KEY_TAB / KEY_RIGHT, чтобы перейти к другой кнопке.

Ошибка запуска

enter image description here QComboBox при всплывающем окне

enter image description here нажатие клавиатуры KEY_POWER 2 секунды мое окно показывает, фокус на левой кнопке.Фон QComboBox по-прежнему синий .

enter image description here нажмите KEY_DOWN эффект на QComobox

1 Ответ

0 голосов
/ 06 июня 2018

устройство псевдо-сенсорного ввода

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

Итак, симуляциясенсорный ввод нажмите экран в любом месте, прежде чем показывать окно.

void pseudo_touch(int fd)
{
    struct input_event event;
    int len;

    event.type = EV_ABS;                        // touch press down
    event.code = ABS_PRESSURE;
    event.value = 1;
    gettimeofday(&event.time, NULL);
    len = write(fd, &event, sizeof(event));


    event.type = EV_ABS;                       // post coordinate X,Y make sure don't press any control box
    event.code = ABS_X;                        // ADC range is from 0 to 4095
    event.value = 0x9000;                      // ADC X = 0x9000
    gettimeofday(&event.time, NULL);
    len = write(fd, &event, sizeof(event));
    event.type = EV_ABS;
    event.code = ABS_Y;                        // ADC Y = 0xA000
    event.value = 0xa000;
    gettimeofday(&event.time, NULL);
    len = write(fd, &event, sizeof(event));

    event.type = EV_SYN;                       // synchronous one event
    event.code = SYN_REPORT;
    event.value = 0;
    gettimeofday(&event.time, NULL);
    len = write(fd, &event, sizeof(event));

    event.type = EV_ABS;                       // touch press up
    event.code = ABS_PRESSURE;
    event.value = 0;
    gettimeofday(&event.time, NULL);
    len = write(fd, &event, sizeof(event));

    event.type = EV_SYN;                       // synchronous one event
    event.code = SYN_REPORT;
    event.value = 0;
    gettimeofday(&event.time, NULL);
    len = write(fd, &event, sizeof(event));
}

void *ThreadMinitorKey(void *arg)
{
    struct input_event key_event;

    fd       = open("/dev/input/event0", O_RDONLY);   // Keyboard   
    fd_touch = open("/dev/input/event2", O_RDWR);     // Touch

    while(1) {
        len = read(fd, &key_event, sizeof(key_event));
        if (len != -1 && key_event.type == EV_KEY) {
            if (press_KEW_POWER_2_sec()) {
                pseudo_touch(fd_touch);
                g_dialog->show();
            }
        }
    }
}


void DlgShutdown::focusInEvent(QFocusEvent *event)
{
    pBtnCanel->setFocus();
}
...