Как я могу заменить скопированный текст из QTextEdit в моем буфере обмена?
У меня есть QTextEdit, который содержит текст:
It's test.
Я хочу выделить этот текст и скопировать его в буфер обмена, используя Ctrl+C, но я хочу заменить "test" на "good" в моем буфере обмена.
Я имею в виду: я хочу получить это в своем буфере обмена после копирования оригинального текста из QTextEdit
:
It's good.
Примечание: я хочу заменить буфер обмена, когда скопировал текст только из QTextEdit, я не хочу заменять буфер обмена, когда выполнено какое-либо действие копирования.
Благодарю.
2 ответа
Предполагая, что у вас есть указатель на QClipboard
называется clipboard
:
QString data = clipboard->text();
data.replace(QString("test"), QString("good"));
clipboard->setText(data);
Это использует функции QString::replace
изменить текст в буфере обмена QClipboard::text
) а также QClipboard::setText
установить новый текст для буфера обмена.
Было бы лучше использовать Сигналы / Слоты для синхронизации того, что нужно изменить в буфере обмена, с тем, что вы фактически делаете в поле QTextEdit, чтобы избежать неопределенного поведения и случайного изменения вещей, выходящих за рамки вашей задачи. для того, чтобы сделать это поймать signal
испускается, когда вы выделяете это конкретное поле QTextEdit, этот сигнал гарантирует, что вы можете скопировать выделенный текст QTextEdit::copyAvailable(bool yes)
.. yes
указывает на наличие выделенного текста.
Самое главное, убедитесь, что вы получаете доступ к глобальному буферу обмена только тогда, когда вы нажимаете CTRL+C выделенный текст из поля QTextEdit, прикрепляя его к сигналу. 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();
}