Russian Qt Forum
Май 02, 2024, 02:31 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало Форум WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  
  Просмотр сообщений
Страниц: 1 ... 116 117 [118] 119 120 ... 122
1756  Qt / Пользовательский интерфейс (GUI) / Re: QTextEdit + Изменение регистра символов : Август 13, 2012, 15:25
Swa, спасибо за такой ясный и понятный ответ Улыбающийся
все, вопросов нет Улыбающийся
1757  Qt / Пользовательский интерфейс (GUI) / Re: QTextEdit + Изменение регистра символов : Август 13, 2012, 15:01
А можно будет облегчить код, не используя блоки текста и фрагменты, а получая курсор от документа, и у выделенных курсором символов поменять регистр, при этом не потеряв форматирования символов (шрифт, выделение, почеркивание, цвет)?
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();
}
1759  Qt / Пользовательский интерфейс (GUI) / Re: QTextEdit + Изменение регистра символов : Август 13, 2012, 13:47
даааа...вот так работать с text edit и курсором я пока не умею... Грустный
Спасибо, Swa за рабочий пример, буду изучать Улыбающийся
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, который находится перед позицией курсора, например:
до: helloo выделяем "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!
    Спасибо Улыбающийся
    1763  Qt / Пользовательский интерфейс (GUI) / Re: Изменение названия QAction в контекстном меню QTextEdit : Июль 09, 2012, 15:07
    нет, не в дизайнере, мне почему то удобнее делать вручную=)
    я написал функцию:
    Код:
    void setLanguage(QString language);
    в ней содержатся все случаи называния объектов, которое видит пользователь=)
    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 работают
    1766  Qt / Пользовательский интерфейс (GUI) / Re: Общее контекстное меню для нескольких виджетов : Июль 08, 2012, 21:05
    Похоже придется создавать новую тему..
    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 работают
    1768  Qt / Пользовательский интерфейс (GUI) / Re: Общее контекстное меню для нескольких виджетов : Июль 05, 2012, 18:53
    хх, и вправду, работает с такой политикой Улыбающийся
    и никакого лишнего кода Улыбающийся
    спасибо, Kolobok Улыбающийся
    1769  Qt / Пользовательский интерфейс (GUI) / Re: Общее контекстное меню для нескольких виджетов : Июль 04, 2012, 23:08
    Спасибо за дельный совет Улыбающийся
    1770  Qt / Пользовательский интерфейс (GUI) / Re: Общее контекстное меню для нескольких виджетов : Июль 04, 2012, 23:04
    Понятно Улыбающийся
    Страниц: 1 ... 116 117 [118] 119 120 ... 122

    Страница сгенерирована за 0.056 секунд. Запросов: 23.