Прослушивание 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();
}