如何从剪贴板中的QTextEdit替换复制的文本?

时间:2018-02-13 21:08:19

标签: c++ qt qt-creator clipboard qtextedit

我有一个QTextEdit,其中包含文字:

It's test.

我想选择此文本并使用Ctrl + C将其复制到我的剪贴板,但我想在剪贴板中将“test”替换为“good”。

我的意思是:我希望在复制QTextEdit的原始文字后将其放入剪贴板中:

It's good.

注意:我只想在从QTextEdit复制文本时替换剪贴板,我不想在完成任何复制操作时替换剪贴板。

感谢。

2 个答案:

答案 0 :(得分:2)

假设您有一个指向名为QString data = clipboard->text(); data.replace(QString("test"), QString("good")); clipboard->setText(data); 的{​​{3}}的指针:

private async Task<List<PingReply>> PingAsync()
{
    Ping pingSender = new Ping();
    var tasks = serverNames.Select(
            ip => pingSender.SendPingAsync(ip, 2000)
    );
    var results = await Task.WhenAll(tasks);
    return results.ToList();
}

这使用函数QClipboard修改剪贴板的文本(从QString::replace访问)和QClipboard::text以设置剪贴板的新文本。

答案 1 :(得分:2)

最好使用信号/插槽来同步在剪贴板中更改的内容与您在QTextEdit字段中实际执行的内容,以避免未定义的行为和意外地修改任务范围之外的事情。为了做到这一点,当 突出显示 这个特定的QTextEdit字段时,会发出signal,该信号可以确保您可以复制突出显示的文本QTextEdit::copyAvailable(bool yes) .. yes表示突出显示文本的可用性。

最重要的是,只有当您从QTextEdit字段中按CTRL + C突出显示文本时,请确保您正在访问全局剪贴板,方法是附加信号QClipboard::dataChanged,表示您复制了文本...然后仅修改文本。

  

测试此代码:编写句子..突出显示..使用CTRL + C.   复制到剪贴板及其修改过的。

实施例: 类文件可以如下所示:

.h
{
private slots:
    void textSelected(bool yes);
    void changeTextCopiedToCB();

private:
    QClipboard *clipboard;
};

班级.cpp

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    connect(this->ui->textEdit, &QTextEdit::copyAvailable, this, &MainWindow::textSelected); // emmited when you select the text
    clipboard = QApplication::clipboard();
}

void MainWindow::textSelected(bool yes) // Slot called only when you select text in your field
{
    if (yes){
        qDebug() << this->ui->textEdit->toPlainText();
        connect(clipboard, &QClipboard::dataChanged, this, &MainWindow::changeTextCopiedToCB); // wait tor CTRL+C
    }
}
void MainWindow::changeTextCopiedToCB() // Once CTRL+C .. the data in clipboard changes..thats my data
{
    QString text = clipboard->text();
    text.replace(QString("test"), QString("good"));
    clipboard->setText(text);
    disconnect(clipboard, &QClipboard::dataChanged, this, &MainWindow::changeTextCopiedToCB); // after copy from this field, leave clipboard alone!
    qDebug() << clipboard->text();
}