我正在尝试制作一个Qt应用程序来监视对系统剪贴板的更改。每当用户将一些文本复制到剪贴板(应用程序之外)时,我的应用程序就应该以某种方式更改该文本,并将更改后的文本复制到剪贴板上。
问题是剪贴板只会变成空的!
这是我的密码:
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
connect(QApplication::clipboard(), SIGNAL(dataChanged()),
this, SLOT(processClipboardChange()));
}
void MainWindow::processClipboardChange()
{
qDebug() << "dataChanged() signal emitted.";
QClipboard * clipboard = QApplication::clipboard();
static bool dontProcessSignal = false;
if (!dontProcessSignal) {
QString text = clipboard->text();
text = "CLIPBOARD CONTENTS CHANGED."; // example.
qDebug() << "Setting clipboard contents...";
dontProcessSignal = true;
clipboard->setText(text); // will trigger another dataChanged() signal.
dontProcessSignal = false;
qDebug() << "Copied " << clipboard->text() << " to clipboard.";
}
else {
qDebug() << "Did not process dataChanged() signal.";
return;
}
}现在,当我运行程序并通过使用Ctrl+C复制一些文本来更改剪贴板内容时,我得到了以下输出:
dataChanged() signal emitted.
Setting clipboard contents...
dataChanged() signal emitted.
Did not process dataChanged() signal.
Copied "CLIPBOARD CONTENTS CHANGED." to clipboard.但是,当我键入Ctrl+V来粘贴剪贴板内容时,什么都不会被粘贴。由于某种原因,剪贴板内容似乎设置为空字符串。
QClipboard::setText()在其他代码中工作得很好(例如,在QPushButton::clicked槽内调用时)。
我不知所措。请帮帮忙。
发布于 2014-06-30 08:08:36
如果您在setText()中处理dataChanged(),那么Qt似乎会删除剪贴板数据。如果您在应用程序内部复制,它不会删除剪贴板。您可以使用QTimer或invokeMethod与QueuedConnection一起解决这个问题:
void MainWindow::processClipboardChange()
{
if (!dontProcessSignal) {
// Solution 1, unable to pass argument
QTimer::singleShot(1, this, SLOT(setClipboard1()));
// Solution 2, able to pass argument
QString newText = "CLIPBOARD CONTENTS CHANGED.";
QMetaObject::invokeMethod(this, "setClipboard2", Qt::QueuedConnection, Q_ARG(QString, newText));
}
}
void MainWindow::setClipboard1() {
dontProcessSignal = true;
QClipboard * clipboard = QApplication::clipboard();
clipboard->setText("CLIPBOARD CONTENTS CHANGED.");
dontProcessSignal = false;
}
void MainWindow::setClipboard2(QString s) {
dontProcessSignal = true;
QClipboard * clipboard = QApplication::clipboard();
clipboard->setText(s);
dontProcessSignal = false;
}https://stackoverflow.com/questions/24478060
复制相似问题