Qml не отвечает GUI при использовании методов класса [duplicate]

Используя filter , вам понадобится только одна строка

line = filter(lambda char: char not in " ?.!/;:", line)

. Это обрабатывает строку как итерируемую и проверяет каждый символ, если lambda возвращает True:

>>> help(filter)
Help on built-in function filter in module __builtin__:

filter(...)
    filter(function or None, sequence) -> list, tuple, or string

    Return those items of sequence for which function(item) is true.  If
    function is None, return the items that are true.  If sequence is a tuple
    or string, return the same type, else return a list.

11
задан krzych 19 December 2012 в 10:35
поделиться

2 ответа

Поскольку вы не указали Qt::ConnectionType, метод будет вызываться как Qt::AutoConnection, а это означает, что он будет вызываться синхронно (как обычный вызов функции), если сродство потока объекта к текущему потоку, и асинхронно в противном случае. «Асинхронно» означает, что QEvent создается и помещается в очередь сообщений и будет обрабатываться, когда цикл события достигнет его.

Причина использования QMetaObject::invokeMethod, если объект-получатель может находиться в другой поток заключается в том, что попытка вызвать слот непосредственно на объект в другом потоке может привести к повреждению или ухудшению, если он обращается или изменяет данные, не содержащие потоки.

23
ответ дан ecatmur 26 August 2018 в 08:55
поделиться

Мне нравится этот трюк:

void A:doSomethingSlot()
{
     if (thread()!=QThread::currentThread()) {
         QMetaObject::invokeMethod(this,"doSomethingSlot", Qt::QueuedConnection);
         return;
     }
     // this is done always in same thread
     ...
     emit ready();
}
19
ответ дан Marek R 26 August 2018 в 08:55
поделиться
Другие вопросы по тегам:

Похожие вопросы: