处理QClipboard:: datachchanged()信号时出现问题
Trouble handling QClipboard::dataChanged() signal
我正在尝试制作一个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
插槽中调用时)。
我很茫然。请帮助。
我成功地使用了fxam上面描述的QTimer
方法来解决这个问题。
这是我所有的代码供将来的读者使用:
mainwindow.h
:
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QMainWindow>
namespace Ui {
class MainWindow;
}
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
explicit MainWindow(QWidget *parent = 0);
private slots:
void clipboardChanged();
void setClipboard();
private:
QString clipboardText;
private:
Ui::MainWindow *ui;
};
#endif // MAINWINDOW_H
mainwindow.cpp
:
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QClipboard>
#include <QTimer>
#include <QRegularExpression>
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
connect(QApplication::clipboard(), SIGNAL(dataChanged()),
this, SLOT(clipboardChanged()));
}
void MainWindow::clipboardChanged()
{
// we need to ignore every other dataChanged() signal because
// those signals are triggered by us calling QClipboard::setText()
static bool ignoreSignal = false;
if (ignoreSignal == false) {
clipboardText = QApplication::clipboard()->text();
// will trigger another dataChanged() signal
// (after our method exits)
QTimer::singleShot(50, this, SLOT(setClipboard()));
// ignore the next dataChanged() signal
ignoreSignal = true;
}
else {
// We're ignoring this signal. Don't ignore the next signal.
ignoreSignal = false;
}
}
void MainWindow::setClipboard()
{
static QRegularExpression regex("x+"); // example...
static QString replacement("a");
QString newClipboardText = clipboardText.replace(regex, replacement);
QApplication::clipboard()->setText(newClipboardText);
}
似乎Qt删除剪贴板数据,如果你乱搞setText()内的datachchanged()。如果在应用程序内部进行复制,它不会删除剪贴板。您可以使用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;
}
相关文章:
- 代码在我的计算机上运行良好,但是在将其提交给coursera时遇到未知的信号11问题
- Qt 信号/插槽问题
- 使用 sv hup SIGHUP 信号重新加载配置时出现问题
- 信号槽自定义结构问题
- 从 Qt 中的信号调用成员函数的问题
- Qt的新信号/时隙语法问题 - 连接到一个简单的函数
- 将组合框信号连接到 Qt 中的 std::function 时出现问题
- QML:收到C 信号从C 传递时刷新问题
- 这个餐饮哲学家问题(dpp)的解决方案是如何工作的?互斥体和信号量
- QlineEdit的信号映射问题
- 在使用 pthread 和信号量实现生产者-消费者问题时需要帮助
- 从主线程向workersread发出信号时出现问题
- 信号量的问题
- 我在Qt信号和插槽问题上的错误在哪里?
- QT 信号插槽问题。发出信号,不调用时隙。没有警告,没有错误,没有消息
- 带有信号的ThreadSafe Singleton的问题
- 如何用单个信号处理程序解决这个多linux定时器的问题
- 问题5.2:QLocalServer接收重复的readyRead信号
- 从Wt小部件信号事件运行popen()时出现问题
- QTcpSocket和多个客户端(信号问题)