Прослушивание QClipboard глобально

Хочу глобально слушать события буфера обмена в системе. В Qt для этого есть специальных класс – QClipboard. Используется примерно так:

main_widget::main_widget(QWidget *parent) : QWidget(parent)
{
    clipboard = QApplication::clipboard();
    connect(clipboard, &QClipboard::dataChanged, this, &main_widget::slot_data_changed);
}
void main_widget::slot_data_changed()
{
    const QMimeData *mime_data = clipboard->mimeData();
    if (mime_data->hasText())
    {
        QString value = clipboard->text();
        qDebug() << value;
    }
}

Однако есть проблема. Сигнал QClipboard::dataChanged будет послан только когда активируется окно приложения. В моем случае это важно, поскольку планирую проводить обработку именно в фоне. Придумал следующее решение:

main_widget::main_widget(QWidget *parent) : QWidget(parent)
{
    clipboard = QApplication::clipboard();
    clipboard_timer = new QTimer();
    clipboard_timer->setInterval(250);
    clipboard_timer->start();
    connect(clipboard_timer, &QTimer::timeout, this, &main_widget::slot_check_clipboard);
}
void main_widget::slot_check_clipboard()
{
    const QMimeData *mime_data = clipboard->mimeData();
    if (mime_data->hasText())
    {
        QString value = clipboard->text();
        qDebug() << value;
    }
}

Проще говоря, проверять буфер обмена по таймеру. Это решение работает отлично, однако это очень неэффективно и может вызвать огромные проблемы. Есть ли какое-то решение этой проблемы?


Ответы (1 шт):

Автор решения: Alexander Chernin

Если я правильно понял, то как-то так:

int main(int argc, char* argv[]) {
    QApplication a(argc, argv);

    QClipboard* clipboard = QApplication::clipboard();
    main_widget main;

    // Сигнал будет срабатывать независимо от окна приложения, 
    // а только от наличия данных буфере обмена
    QObject::connect(clipboard, &QClipboard::dataChanged, [&]() {
         const QMimeData *mime_data = clipboard->mimeData();
         if (mime_data->hasText())
         {
             QString value = clipboard->text();
             qDebug() << value;
             main.set_clipboard_data(value);
         }
    });

    //...

    return a.exec();
}
→ Ссылка