gpt4 book ai didi

c++ - 无法处理 QClipboard::dataChanged() 信号

转载 作者:搜寻专家 更新时间:2023-10-31 01:04:09 28 4
gpt4 key购买 nike

我正在尝试制作一个 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 方法来解决问题。

这是我为 future 的读者准备的所有代码:

主窗口.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

主窗口.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);
}

关于c++ - 无法处理 QClipboard::dataChanged() 信号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24478060/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com