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

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1] 2   Вниз
  Печать  
Автор Тема: QTextEdit default font  (Прочитано 10975 раз)
andrew.k
Гость
« : Июль 31, 2012, 00:49 »

Напишу подробно, хотя вроде это не требуется.
В делегате используется QTextEdit. Хотя думаю это не особо важно.
У меня есть комбо с размером шрифта. Доступные размеры ограничены (т.е. не любой размер можно задать) и крупнее шрифта, заданного стилем приложения.
Вот пока редактируешь документ все хорошо. При создании редактора задаю дефолтный шрифт.
Но если полностью очистить текст, то выставляется один и тот же шрифт, который задан в приложении.
Я не согласен с этим. Как побороть?

Как задаю дефолтный шрифт:
Код
C++ (Qt)
   int pointSize = ui->cbFontSize->currentText().toInt();
   QFont font = ui->text->document()->defaultFont();
   font.setPointSize(pointSize);
   ui->text->document()->setDefaultFont(font);
   ui->text->setFontPointSize(pointSize);

Цитата: Внутренний голос Andrew.k
Верес, если ты не знаешь ответа на вопрос, не пиши ничего!
Верес, если ты думаешь, что знаешь ответ, но он сформулирован не в виде кода или ссылки на нужный метод, не пиши ничего!
Верес, если ты не понимаешь вопроса, не пиши ничего!
Верес, если ты прочитал это и хочешь что-то написать по этому поводу, не пиши ничего!
« Последнее редактирование: Июль 31, 2012, 01:12 от andrew.k » Записан
andrew.k
Гость
« Ответ #1 : Июль 31, 2012, 00:54 »

Нашел такую же проблему, но ответа нет совсем.
Больше гугол не помог.
Записан
Bepec
Гость
« Ответ #2 : Июль 31, 2012, 06:44 »

Кури исходники Улыбающийся


Код:
void QTextControlPrivate::setContent(Qt::TextFormat format, const QString &text, QTextDocument *document)
{
    Q_Q(QTextControl);

    // for use when called from setPlainText. we may want to re-use the currently
    // set char format then.
    const QTextCharFormat charFormatForInsertion = cursor.charFormat();

    bool clearDocument = true;
    if (!doc) {
        if (document) {
            doc = document;
            clearDocument = false;
        } else {
            palette = QApplication::palette("QTextControl");
// QTextDocument *doc; - приватный член класса QTextControl
///------------------------------------------------------------

            doc = new QTextDocument(q);

///------------------------------------------------------------

        }
        _q_documentLayoutChanged();
        cursor = QTextCursor(doc);

// ####        doc->documentLayout()->setPaintDevice(viewport);

        QObject::connect(doc, SIGNAL(contentsChanged()), q, SLOT(_q_updateCurrentCharFormatAndSelection()));
        QObject::connect(doc, SIGNAL(cursorPositionChanged(QTextCursor)), q, SLOT(_q_emitCursorPosChanged(QTextCursor)));
        QObject::connect(doc, SIGNAL(documentLayoutChanged()), q, SLOT(_q_documentLayoutChanged()));

        // convenience signal forwards
        QObject::connect(doc, SIGNAL(undoAvailable(bool)), q, SIGNAL(undoAvailable(bool)));
        QObject::connect(doc, SIGNAL(redoAvailable(bool)), q, SIGNAL(redoAvailable(bool)));
        QObject::connect(doc, SIGNAL(modificationChanged(bool)), q, SIGNAL(modificationChanged(bool)));
        QObject::connect(doc, SIGNAL(blockCountChanged(int)), q, SIGNAL(blockCountChanged(int)));
    }

    bool previousUndoRedoState = doc->isUndoRedoEnabled();
    if (!document)
        doc->setUndoRedoEnabled(false);

    //Saving the index save some time.
    static int contentsChangedIndex = QTextDocument::staticMetaObject.indexOfSignal("contentsChanged()");
    static int textChangedIndex = QTextControl::staticMetaObject.indexOfSignal("textChanged()");
    // avoid multiple textChanged() signals being emitted
    QMetaObject::disconnect(doc, contentsChangedIndex, q, textChangedIndex);

    if (!text.isEmpty()) {
        // clear 'our' cursor for insertion to prevent
        // the emission of the cursorPositionChanged() signal.
        // instead we emit it only once at the end instead of
        // at the end of the document after loading and when
        // positioning the cursor again to the start of the
        // document.
        cursor = QTextCursor();
        if (format == Qt::PlainText) {
            QTextCursor formatCursor(doc);
            // put the setPlainText and the setCharFormat into one edit block,
            // so that the syntax highlight triggers only /once/ for the entire
            // document, not twice.
            formatCursor.beginEditBlock();
            doc->setPlainText(text);
            doc->setUndoRedoEnabled(false);
            formatCursor.select(QTextCursor::Document);
            formatCursor.setCharFormat(charFormatForInsertion);
            formatCursor.endEditBlock();
        } else {
#ifndef QT_NO_TEXTHTMLPARSER
            doc->setHtml(text);
#else
            doc->setPlainText(text);
#endif
            doc->setUndoRedoEnabled(false);
        }
        cursor = QTextCursor(doc);
    } else if (clearDocument) {
        doc->clear();
    }
    cursor.setCharFormat(charFormatForInsertion);

    QMetaObject::connect(doc, contentsChangedIndex, q, textChangedIndex);
    emit q->textChanged();
    if (!document)
        doc->setUndoRedoEnabled(previousUndoRedoState);
    _q_updateCurrentCharFormatAndSelection();
    if (!document)
        doc->setModified(false);

    q->ensureCursorVisible();
    emit q->cursorPositionChanged();
}

При очистке создаётся новый QTextDocument с дефолтными значениями. Значит тебе надо отслеживать создание нового QTextDocument и сохранять/устанавливать шрифт у себя.

PS внутреннему голосу привет Улыбающийся Заразный он что ли? Сразу у нескольких человек открылся Улыбающийся (Дурное быстро прилипает Подмигивающий )
« Последнее редактирование: Июль 31, 2012, 07:00 от Bepec » Записан
andrew.k
Гость
« Ответ #3 : Июль 31, 2012, 11:40 »

Кури исходники Улыбающийся


Код:
void QTextControlPrivate::setContent(Qt::TextFormat format, const QString &text, QTextDocument *document)
{
    Q_Q(QTextControl);

    // for use when called from setPlainText. we may want to re-use the currently
    // set char format then.
Я не знаю, к чему ты привел этот кусок кода, но setPlainText я не вызываю.

При очистке создаётся новый QTextDocument с дефолтными значениями. Значит тебе надо отслеживать создание нового QTextDocument и сохранять/устанавливать шрифт у себя.
Стал смотреть в textChanged() адрес документа возвращаемого QTextEdit::document() не меняется. Хотя в принципе это возможно, если он пересоздался по тому же адресу. Но не очень вероятно.
Дальше. я при создании задал для QTextDocument динамическое свойство, которое сохранялось и ни куда не девалось на протяжении эксперимента.

Отсюда вывод. QTextDocument не пересоздается. Хотя непонятно зачем текстедиту это вообще делать?

PS внутреннему голосу привет Улыбающийся Заразный он что ли? Сразу у нескольких человек открылся Улыбающийся (Дурное быстро прилипает Подмигивающий )
Очевидно, что с ним все в порядке.


Записан
Bepec
Гость
« Ответ #4 : Июль 31, 2012, 11:49 »

Кхм... Ну видно тебе уже не поможешь Веселый

Но всё же посмотри исходники - на вызове clear вызывается setContent() и прочая Улыбающийся

PS ну да ладно. Если ты не можешь/хочешь верить и не можешь/хочешь смотреть исходники - тогда горько сиди Улыбающийся  

PPS
Код:
void QTextControl::clear()
{
    Q_D(QTextControl);
    // clears and sets empty content
    d->extraSelections.clear();
    d->setContent();
}
« Последнее редактирование: Июль 31, 2012, 11:52 от Bepec » Записан
andrew.k
Гость
« Ответ #5 : Июль 31, 2012, 11:55 »

Но всё же посмотри исходники - на вызове clear вызывается setContent() и прочая Улыбающийся
Я очень рад. Но я не вызываю метод clear()!
Я не знаю как тебе объяснять. Я просто редактирую текст в гуи.

PS ну да ладно. Если ты не можешь/хочешь верить ...
У нас тут не церковная школа, чтобы верить.
Тем более когда подсовывают ложные факты, верить не хочется еще больше.

... и не можешь/хочешь смотреть исходники - тогда горько сиди Улыбающийся  
Посмотреть исходники я и без тебя могу догадаться, но на это нужно время, которого сейчас нет.
Записан
andrew.k
Гость
« Ответ #6 : Июль 31, 2012, 11:56 »

позже сделаю тестовый пример.
Записан
Bepec
Гость
« Ответ #7 : Июль 31, 2012, 13:04 »

Редактирование разве не вызывает метод setContent(%изменённое содержимое) ? Показает язык
Записан
andrew.k
Гость
« Ответ #8 : Июль 31, 2012, 13:17 »

Редактирование разве не вызывает метод setContent(%изменённое содержимое) ? Показает язык
Ты думаешь, после ввода каждой буквы создается, новый QTextDocument?
« Последнее редактирование: Июль 31, 2012, 13:52 от Пантер » Записан
Bepec
Гость
« Ответ #9 : Июль 31, 2012, 15:17 »

Мда. И код ты читать не умеешь Веселый Печаль.
Записан
andrew.k
Гость
« Ответ #10 : Июль 31, 2012, 16:40 »

Сделал тестовый проект на основе другого.
Интересует кнопка Set Default.

Верес, исчезни куда-нибудь и не пиши сюда.
Записан
Bepec
Гость
« Ответ #11 : Июль 31, 2012, 17:27 »

Стань администратором форума, мб исчезну Улыбающийся

PS проект посмотрю Улыбающийся
Записан
andrew.k
Гость
« Ответ #12 : Август 01, 2012, 18:11 »

Неужели опять никто?
Вроде задача не хитрая.
Записан
kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4747



Просмотр профиля WWW
« Ответ #13 : Август 01, 2012, 18:42 »

в мак ос такое поведение тоже проявляется. можешь просто каждый раз запоминать шрифт в currentCharFormatChanged(), а как только в обработчике сигнала textChanged() длина текста будет равна нулю, выставишь сохраненный шрифт. я проверял - textChanged() приходит после currentCharFormatChanged().
Записан

Изучением C++ вымощена дорога в Qt.

UTF-8 has been around since 1993 and Unicode 2.0 since 1996; if you have created any 8-bit character content since 1996 in anything other than UTF-8, then I hate you. © Matt Gallagher
Alex Custov
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2063


Просмотр профиля
« Ответ #14 : Август 01, 2012, 18:52 »

определённо нужно запилить багрепорт
Записан
Страниц: [1] 2   Вверх
  Печать  
 
Перейти в:  


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