1758
|
Qt / Пользовательский интерфейс (GUI) / Re: QTextEdit + Изменение регистра символов
|
: Август 13, 2012, 14:50
|
Кое что конечно не понятно: QTextCursor cursor = this->textCursor();
int start = cursor.selectionStart(); int end = cursor.selectionEnd(); int cStart = 0; int cEnd = 0; // получем текстовый блок используя позицию курсора QTextBlock block = document()->findBlock(start);
while (true) { if (!block.isValid()) {break;} // если блок не существует if (block.position() > end) {break;} // если позиция первого символа в блоке > end (а это может быть??) QTextBlock::iterator it;
// перебираем символы блока с начала до конца for(it = block.begin(); !(it.atEnd()); ++it) { // текстовый фрагмент - это ведь слова, символы, отделенные друг от друга разделителем (пробел например)? QTextFragment currentFragment = it.fragment(); if (!currentFragment.isValid()) {continue;} // если не существует int fs = currentFragment.position(); // нач позиция int fe = currentFragment.position() + currentFragment.length(); // конечная
if (end < fs || start > fe) {continue;} // еще одна проверка
QTextCursor temp(document()); // а почему получаем именно от документа курсор, а не от text edit?
// определяем нач и кон позицию // передвижения курсора по документу if (start < fs) { cStart = fs; } else { cStart = start; }
if (end < fe) { cEnd = end; } else { cEnd = fe; }
// курсор будет находиться в позиции cStart temp.setPosition(cStart); // сдвигаем вправо, выделяя пройденные символы temp.movePosition(QTextCursor::Right, QTextCursor::KeepAnchor, cEnd - cStart);
QString text = temp.selectedText();
text = text.toUpper();
//помещаем вставку в этот блок, чтобы можно было использовать после //undo и redo temp.beginEditBlock(); temp.insertText(text); temp.endEditBlock(); } // смотрим следующий блок block = block.next(); }
|
|
|
1760
|
Qt / Пользовательский интерфейс (GUI) / Re: QTextEdit + Изменение регистра символов
|
: Август 13, 2012, 11:11
|
вот если бы можно было получить QTextCharFormat для каждого символа выделенного текста и скажем сохранить их например в контейнер, то: QString text = cursor.selectedText(); QString changeText = makeCaseSensitiveUpper(text); for(int i = 0; i < changeText.size(); i++) cursor.insertText(changeText.data()[i]);
и в функции insertText(), в качестве второго параметра передавать QTextCharFormat данного символа, то что это сработает показывает код снизу: QTextCharFormat charFormat; charFormat.setForeground(Qt::yellow); cursor.insertText(changeText.data()[0], charFormat);
|
|
|
1761
|
Qt / Пользовательский интерфейс (GUI) / Re: QTextEdit + Изменение регистра символов
|
: Август 13, 2012, 10:52
|
Я выбрал cursor.selection() потому что в документации было написано что это в отличии от selectedText() используется для работы с rich text, потом использовал textFragment.toHTML(), но оно не прокатило, поэтому перешел на toPlainText(). Сделал с insertText(), оно работает, только не годится оно для rich text - если например использую следующий код: QString text = cursor.selectedText(); QString changeText = makeCaseSensitiveUpper(text); cursor.insertText(changeText);
только есть проблемка с QTextCharFormat: cursor.insertText(), использует тот QTextCharFormat, который находится перед позицией курсора, например: до: h elloo выделяем "llo", теперь в зависимости от того с какого края выделяли: слева-направо или наоборот будет разный результат: слева-направо: lloсправо-налево: llo Ну как то так=)
|
|
|
1762
|
Qt / Пользовательский интерфейс (GUI) / QTextEdit + Изменение регистра символов
|
: Август 12, 2012, 17:32
|
Здраствуйте! Кому не лень, помогите делаю панельку форматирования текста, связанную с textEdit, в качестве основы, взял пример Text EditЗахотелось добавить возможность поменять регистр выделенных символов, для этого использую функции: QString UTextEdit::makeCaseSensitiveUpper(QString InputString) { return InputString.toUpper(); } QString UTextEdit::makeCaseSensitiveLower(QString InputString) { return InputString.toLower(); } QString UTextEdit::makeCaseSensitiveNegative(QString InputString) { for (int i = 0; i < InputString.size(); i++) { if(InputString[i].isLower()) InputString[i] = InputString[i].toUpper(); else InputString[i] = InputString[i].toLower(); } return InputString; }
для изменения выделенных символов делаю следующее: enum UTypesOfCaseSensitive { UpperCaseSensitive, LowerCaseSensitive, NegativeCaseSensitive };
void UTextEdit::textCaseSensitiveEdit(UTypesOfCaseSensitive typeOfCaseSensitive) { QTextCursor cursor = this->textCursor();
if(!cursor.selectedText().isEmpty()) { cursor.beginEditBlock();
if(typeOfCaseSensitive == UpperCaseSensitive) { QTextDocumentFragment textFragment = cursor.selection(); QString text = textFragment.toPlainText(); QString changeText = makeCaseSensitiveUpper(text); this->setText(this->toPlainText().replace(QString(text), QString(changeText));
}else if(typeOfCaseSensitive == LowerCaseSensitive) { QTextDocumentFragment textFragment = cursor.selection(); QString text = textFragment.toPlainText(); QString changeText = makeCaseSensitiveLower(text); this->setText(this->toHtml().replace(QString(text), QString(changeText)); }else if(typeOfCaseSensitive == NegativeCaseSensitive) { QTextDocumentFragment textFragment = cursor.selection(); QString text = textFragment.toPlainText(); QString changeText = makeCaseSensitiveNegative(text); this->setText(this->toHtml().replace(QString(text), QString(changeText)); }
cursor.endEditBlock(); } }
Вот до этого смог додуматься, но есть проблемы: this->setText(this->toHtml().replace(QString(text), QString(changeText)); - такой код не годится - будет весело, если в тексте будет что то повторяться
- при таком коде, если среди выделенных символов есть отличающиеся шрифтом, то замены не будет
можно замену делать вот так: [/list] this->setText(this->toPlainText().replace(QString(text), QString(changeText)); тогда: - после замены, если текст располагался на нескольких строках, все они окажутся на первой
- форматирование текста (цвет, выделение, подчеркивания) пропадает
Можно вместо QString & QString::replace ( const QString & before, const QString & after, Qt::CaseSensitivity cs = Qt::CaseSensitive ), использовать QString & QString::replace ( int position, int n, const QString & after ), тогда проблема в том что указание позиции курсора текста, в качестве параметра не катит, ведь мне нужно чтобы была поддержка rich text, а это html текст, а курсор в тексте не подходит для использования в html тексте, т.е. что то вроде этого не прокатит: QTextDocumentFragment textFragment = cursor.selection(); QString text = textFragment.toPlainText(); QString changeText = makeCaseSensitiveNegative(text); this->setText(this->toHtml().replace(cursor.position(), text.size(), changeText);
Помогите с написанием кода, который бы заменял выделенный текст в TextEdit, на тот который с измененным регистром, и при этом изменяемый текст сохранял бы свой шрифт: до: Hello World! после: HELLO WORLD! Спасибо
|
|
|
1764
|
Qt / Пользовательский интерфейс (GUI) / Re: Изменение названия QAction в контекстном меню QTextEdit
|
: Июль 09, 2012, 01:20
|
Похоже нет. Пришлось, выбрать альтернативный вариант: самому сделать эти QAction, благо у QTextEdit есть нужные слоты QAction *actionCut = new QAction(this); QAction *actionCopy = new QAction(this); QAction *actionPaste = new QAction(this);
actionCut->setShortcut(QKeySequence::Cut); actionCopy->setShortcut(QKeySequence::Copy); actionPaste->setShortcut(QKeySequence::Paste);
connect(actionCut, SIGNAL(triggered()), &textEdit, SLOT(cut())); connect(actionCopy, SIGNAL(triggered()), &textEdit, SLOT(copy())); connect(actionPaste, SIGNAL(triggered()), &textEdit, SLOT(paste()));
а чтобы action вели себя правильно, нужно добавить логику: в контекстном эвенте QMenu *menu = new QMenu();
QTextCursor textCursor = textEdit.textCursor();
actionCut->setEnabled(true); actionCopy->setEnabled(true); // если не выделенно ничего if(textCursor.selectionEnd() - textCursor.selectionStart() <= 0) { actionCut->setEnabled(false); actionCopy->setEnabled(false); }
actionCut->setVisible(true); actionPaste->setVisible(true);
// если в тектовом редакторе возможно только считывание if(textEdit.isReadOnly()) { actionCut->setVisible(false); actionPaste->setVisible(false); }
menu->addAction(actionCut); menu->addAction(actionCopy); menu->addAction(actionPaste);
menu->exec(event->globalPos()); delete menu;
Если у кого нибудь есть идеи, как сделать, то о чем я спрашивал, проще, прощу, пишите
|
|
|
1765
|
Qt / Пользовательский интерфейс (GUI) / [РЕШЕНО] Изменение названия QAction в контекстном меню QTextEdit
|
: Июль 08, 2012, 21:08
|
Можно ли, QAction, появляющиеся в контексном меню текстовых редакторов (QTextEdit, QLineEdit), перевести например на русский язык, так чтобы ими можно было пользоваться? QMenu *menuTextEdit = textEdit.createStandardContextMenu();
// получаем указатели
QAction *actionUndo = menuTextEdit->actions().at(0); QAction *actionRedo = menuTextEdit->actions().at(1); QAction *actionCut = menuTextEdit->actions().at(3); QAction *actionCopy = menuTextEdit->actions().at(4); QAction *actionPaste = menuTextEdit->actions().at(5); QAction *actionSelectAll = menuTextEdit->actions().at(8);
// в событии контексного меню:
QMenu *menu = new QMenu();
menu->addAction(actionCut); menu->addAction(actionCopy); menu->addAction(actionPaste); menu->addSeparator(); menu->addAction(actionSelectAll);
// добавляю свои действия menu->addSeparator(); menu->addAction(actionSettings); menu->addSeparator(); menu->addAction(actionHide); menu->addAction(actionLock); menu->addAction(actionUnlock); menu->addAction(actionDelete); menu->exec(point); delete menu;
если хочется назвать действия подругому, то меняю setText нужного мне QAction, НО только, когда я добавляю вручную QAction в меню, почти все перестают работать (вставка (Paste) исключение) а если получить список QAction, и добавить именно список, то все QAction работают
|
|
|
1767
|
Qt / Пользовательский интерфейс (GUI) / Re: Общее контекстное меню для нескольких виджетов
|
: Июль 08, 2012, 17:33
|
Не буду создавать новую тему, а спрошу в этой Можно ли, QAction, появляющиеся в контексном меню текстовых редакторов (QTextEdit, QLineEdit), перевести например на русский язык, так чтобы ими можно было пользоваться? QMenu *menuTextEdit = textEdit.createStandardContextMenu();
// получаем указатели
QAction *actionUndo = menuTextEdit->actions().at(0); QAction *actionRedo = menuTextEdit->actions().at(1); QAction *actionCut = menuTextEdit->actions().at(3); QAction *actionCopy = menuTextEdit->actions().at(4); QAction *actionPaste = menuTextEdit->actions().at(5); QAction *actionSelectAll = menuTextEdit->actions().at(8);
// в событии контексного меню:
QMenu *menu = new QMenu();
menu->addAction(actionCut); menu->addAction(actionCopy); menu->addAction(actionPaste); menu->addSeparator(); menu->addAction(actionSelectAll);
// добавляю свои действия menu->addSeparator(); menu->addAction(actionSettings); menu->addSeparator(); menu->addAction(actionHide); menu->addAction(actionLock); menu->addAction(actionUnlock); menu->addAction(actionDelete); menu->exec(point); delete menu;
если хочется назвать действия подругому, то меняю setText нужного мне QAction, НО только, когда я добавляю вручную QAction в меню, почти все перестают работать (вставка исключение) а если получить список QAction, и добавить именно список, то все QAction работают
|
|
|
|
|