gpt4 book ai didi

c++ - 可编辑多色QLineEdit

转载 作者:可可西里 更新时间:2023-11-01 18:37:46 26 4
gpt4 key购买 nike

我知道您可以更改行编辑的颜色,只要所有文本都是相同的颜色,但是可以为字符分配不同的颜色吗?也就是说,有些字符是红色的,有些是黑色的,或者只是每个字符都有不同的颜色。

这里有一个类似的问题- How can I change color of part of the text in QLineEdit? ,但在我的例子中还有一个额外的约束——QLineEdit 在编辑时必须保留颜色位置,而输入的新文本则采用某种默认颜色。另一个问题没有那个约束。

does have an answer这有点用处,但是颜色与文本分离 - 当您编辑行编辑时,恰好在给定位置的任何符号都假定该位置的颜色和格式。也就是说,格式没有锚定到文本。这里有 2 个屏幕截图,看看我在说什么:

enter image description here enter image description here

我将自己解决该缺点,准备就绪后,我会将结果作为答案发布。

我将通过订阅 textEdited() 信号或直接处理输入事件来实现。每次更改文本时,我都会将颜色位置同步到它。

与此同时,如果有人知道我遗漏的非常简单的解决方案,或者解决问题的更简单方法,请随时分享。

最佳答案

我最终通过跟踪光标位置、最后选择的开始和长度以及最后的文本大小实现了它。当发出 textEdited() 信号时,我使用它们来确定插入和/或删除了哪些文本,然后我在颜色数组中重放插入和/或删除以同步它到文本。

您可以指定用于用户插入的文本的颜色。如果不指定,将使用系统默认值,具体取决于系统主题。

唯一的问题是它不支持撤消,因为我不知道如何区分textEdited() 信号是由撤消操作引起的还是不是。


ColorLineEdit.h

#ifndef COLORLINEEDIT_H
#define COLORLINEEDIT_H

#include <QLineEdit>

class ColorLineEdit : public QLineEdit
{
Q_OBJECT
public:
explicit ColorLineEdit(QWidget *parent = 0);
void setCharColors(const QList<QColor> &colors = QList<QColor>());
void setColorForInsertedText(const QColor &colorForInsertedText) { this->colorForInsertedText = colorForInsertedText; }

signals:

private slots:
void onSelectionChanged();
void onTextEdited(const QString &text);

private:
int lastTextSize;
QList<QColor> colors;
QColor colorForInsertedText;
int lastSelectedTextSize;
int lastSelectionStart;
};

#endif // COLORLINEEDIT_H

ColorLineEdit.cpp

#include "colorlineedit.h"
#include <QTextLayout>

ColorLineEdit::ColorLineEdit(QWidget *parent) :
QLineEdit(parent)
{
connect(this, SIGNAL(selectionChanged()), SLOT(onSelectionChanged()));
connect(this, SIGNAL(textEdited(QString)), SLOT(onTextEdited(QString)));
lastSelectedTextSize = 0;
lastSelectionStart = -1;
lastTextSize = 0;
}

void ColorLineEdit::setCharColors(const QList<QColor> &colors)
{
// See http://stackoverflow.com/questions/14417333/how-can-i-change-color-of-part-of-the-text-in-qlineedit.
QList<QInputMethodEvent::Attribute> attributes;
int size = colors.size();
attributes.reserve(size);
for (int ii = 0; ii < size ; ii++) {
if (colors[ii].isValid()) {
QTextCharFormat charFormat;
charFormat.setForeground(QBrush(colors[ii]));
const int start = ii - cursorPosition();
const int length = 1;
attributes.append(QInputMethodEvent::Attribute(QInputMethodEvent::TextFormat, start, length, charFormat));
}
}

QLineEdit::inputMethodEvent(&QInputMethodEvent(QString(), attributes));

lastTextSize = text().size();
this->colors = colors;
}

void ColorLineEdit::onSelectionChanged()
{
lastSelectionStart = selectionStart();
lastSelectedTextSize = selectedText().size();
}

void ColorLineEdit::onTextEdited(const QString &text)
{
if (!lastSelectedTextSize) {
// We don't have a selection, so it's either
// an insertion or deletion, but not both.
int delta = text.size() - lastTextSize;
if (delta > 0) {
// User has inserted text.
int pos = cursorPosition() - delta;
for (int ii = 0; ii < delta; ii++) {
colors.insert(pos, colorForInsertedText);
}
} else {
// User has erased text.
int pos = cursorPosition();
colors.erase(colors.begin() + pos, colors.begin() + pos - delta);
}
} else {
// There was a selection, so we have both removed
// and inserted text.
int pos = lastSelectionStart;
int removedCount = lastSelectedTextSize;
int insertedCount = cursorPosition() - pos;
colors.erase(colors.begin() + pos, colors.begin() + pos + removedCount);
for (int ii = 0; ii < insertedCount; ii++) {
colors.insert(pos, colorForInsertedText);
}
}

setCharColors(colors);
}

示例用法

#include "colorlineedit.h"
#include <QApplication>

int main(int argc, char *argv[])
{
QApplication a(argc, argv);

ColorLineEdit lineEdit;
QList<QColor> colors;
colors.append(Qt::red);
colors.append(Qt::red);
colors.append(Qt::red);
colors.append(Qt::red);
lineEdit.setText("abcd");
lineEdit.setColorForInsertedText(Qt::blue);
lineEdit.setCharColors(colors);
lineEdit.show();

return a.exec();
}

enter image description here enter image description here

:)

关于c++ - 可编辑多色QLineEdit,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24033222/

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