Как исправить поведение моего объекта QClipboard? - PullRequest
0 голосов
/ 16 марта 2019

Я работаю с QClipboard объектом под Windows 10.
Просто пытаюсь увидеть, что находится внутри буфера обмена, когда я нажимаю Ctrl-C на некотором образце текста.
Как видите, результаты очень противоречивыи я не могу понять, почему именно.

Код:

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QDebug>

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    connect(QApplication::clipboard(), SIGNAL(dataChanged()), this, SLOT(showClipboard()));
}

MainWindow::~MainWindow()
{
    delete ui;
}

void MainWindow::showClipboard()
{
    qDebug() << "Clipboard is empty:" << QApplication::clipboard()->text().isEmpty()
             << ":" << QApplication::clipboard()->text();
}

Пример вывода:

Clipboard is empty: false : ""
Clipboard is empty: true : ""
Clipboard is empty: false : "sample text"
Clipboard is empty: false : "sample text"
Clipboard is empty: true : ""
Clipboard is empty: false : ""
Clipboard is empty: false : ""
Clipboard is empty: false : ""
Clipboard is empty: false : "sample text"
Clipboard is empty: true : ""
Clipboard is empty: false : "sample text"
Clipboard is empty: true : ""

1 Ответ

0 голосов
/ 17 марта 2019

Кажется, что введение паузы перед вызовом QApplication::clipboard()->text() устраняет эту проблему.
QTimer или обычный Sleep() / nanoSleep() (Windows / Linux) может использоваться для достижения эффекта.

Пример QTimer:

connect(QApplication::clipboard(), SIGNAL(dataChanged()), this, SLOT(showClipboard()));

void MainWindow::showClipboard()
{
    QTimer::singleShot(50, this, qDebug() << QApplication::clipboard()->text());
}

Windows Sleep() Пример:

connect(QApplication::clipboard(), SIGNAL(dataChanged()), this, SLOT(showClipboard()));

void MainWindow::showClipboard()
{
    Sleep(50);
    qDebug() << QApplication::clipboard()->text();
}
...