QTextEdit :: cursorPositionChanged () — & gt; синхронизировать стиль шрифта с QComboBox и кнопками

У меня проблема. Я набираю текст с размером шрифта 15: «Привет». Затем я набираю текст с размером шрифта 20: «Мир». Когда я меняю положение курсора обратно на первую строку, размер моего шрифта изменится с 20 на 15. Но мой QComboBox по-прежнему показывает «20». Как выполнить синхронизацию стиля шрифта с помощью QComboBox и кнопок (полужирный, курсив, подчеркивание)?

https://thepasteb.in/p/Lghpcmp0oGM1mUW

Код:

#include "notepadwindow.h"#include "ui_notepadwindow.h"#include <QFileDialog>
#include <QComboBox>

NotepadWindow::NotepadWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::NotepadWindow)

{
ui->setupUi(this);
ui->actionBold->setCheckable(true);
ui->actionItalics->setCheckable(true);
ui->actionUnderline->setCheckable(true);
ui->actionLeft->setCheckable(true);
ui->actionRight->setCheckable(true);
ui->actionCenter->setCheckable(true);
ui->actionJustify->setCheckable(true);
this->setCentralWidget(ui->textEdit); // Wyśrodkuj Pole tekstowe
QComboBox* myComboBox = new QComboBox;
ui->mainToolBar->addWidget(myComboBox);
for (int i = 1; i < 102; i += 2) {
myComboBox->addItem(QString::number(i));
}
myComboBox->setCurrentText("11");
ui->textEdit->setFontPointSize(11);
ui->actionLeft->setChecked(true);
ui->actionRight->setChecked(false);
ui->actionCenter->setChecked(false);
ui->actionJustify->setChecked(false);
QObject::connect(myComboBox, SIGNAL(currentTextChanged(QString)), this, SLOT(onFontSizeChanged(QString)));
connect(ui->textEdit, SIGNAL(QTextEdit::cursorPositionChanged()), this, SLOT());}NotepadWindow::~NotepadWindow()
{
delete ui;
}void NotepadWindow::openfile(QString textfile)
{
QFile sFile(textfile);
if(sFile.open(QFile::ReadOnly | QFile::Text)) // Jeśli plik jest otwarty
{
mFilename = textfile;
QTextStream in(&sFile);
in.setCodec("UTF-8"); // Ustaw kodowania znaków na UTF-8
QString text = in.readAll();
sFile.close();
ui->textEdit->setHtml(text);
}
}

void NotepadWindow::onFontSizeChanged(QString selected)
{
ui->textEdit->setFontPointSize(selected.toInt());
}

void NotepadWindow::on_actionUndo_triggered()
{
ui->textEdit->undo();
}

void NotepadWindow::on_actionRedo_triggered()
{
ui->textEdit->redo();
}

void NotepadWindow::on_actionCut_triggered()
{
ui->textEdit->cut();
}

void NotepadWindow::on_actionCopy_triggered()
{
ui->textEdit->copy();
}

void NotepadWindow::on_actionPaste_triggered()
{
ui->textEdit->paste();
}

void NotepadWindow::on_actionNew_triggered()
{
mFilename = "";
ui->textEdit->setPlainText("");
}

void NotepadWindow::on_actionOpen_triggered()
{
QString file = QFileDialog::getOpenFileName(this, "open"); // Otwórz okienko wyboru plików
if(!file.isEmpty())        // Jeśli plik nie jest pusty
{
QFile sFile(file);
if(sFile.open(QFile::ReadOnly | QFile::Text)) // Jeśli plik jest otwarty
{
mFilename = file;
QTextStream in(&sFile);
in.setCodec("UTF-8"); // Ustaw kodowania znaków na UTF-8
QString text = in.readAll();
sFile.close();
ui->textEdit->setHtml(text);
}
}
}

void NotepadWindow::on_actionSave_triggered()
{
QFile sFile(mFilename);
if(sFile.open(QFile::WriteOnly | QFile::Text)) // Jeśli plik jest otwarty
{
QTextStream out(&sFile);
out << ui->textEdit->toHtml();
out.setCodec("UTF-8"); // Ustaw kodowania znaków na UTF-8
sFile.flush();
sFile.close();

}
else if(!sFile.open(QFile::WriteOnly | QFile::Text)) on_actionSave_as_triggered();
}

void NotepadWindow::on_actionSave_as_triggered()
{
QString file = QFileDialog::getSaveFileName(this,  tr("Text File"), "", tr("Text files (*.txt)"));
if(!file.isEmpty())
{
mFilename = file;
on_actionSave_triggered();
}
}void NotepadWindow::on_actionBold_triggered(bool checked)
{
if(checked)
{
ui->textEdit->setFontWeight(QFont::Bold);
}
if(!checked)
{
ui->textEdit->setFontWeight(QFont::Normal);
}

}

void NotepadWindow::on_actionItalics_triggered(bool checked)
{
if(checked)
{
ui->textEdit->setFontItalic(1);
}
if(!checked)
{
ui->textEdit->setFontItalic(0);
}

}

void NotepadWindow::on_actionUnderline_triggered(bool checked)
{
if(checked)
{
ui->textEdit->setFontUnderline(1);
}
if(!checked)
{
ui->textEdit->setFontUnderline(0);
}

}

void NotepadWindow::on_actionLeft_triggered()
{
ui->textEdit->setAlignment(Qt::AlignLeft);
ui->actionLeft->setChecked(true);
ui->actionRight->setChecked(false);
ui->actionCenter->setChecked(false);
ui->actionJustify->setChecked(false);
}

void NotepadWindow::on_actionCenter_triggered()
{
ui->textEdit->setAlignment(Qt::AlignCenter);
ui->actionLeft->setChecked(false);
ui->actionRight->setChecked(false);
ui->actionCenter->setChecked(true);
ui->actionJustify->setChecked(false);
}

void NotepadWindow::on_actionRight_triggered()
{
ui->textEdit->setAlignment(Qt::AlignRight);
ui->actionLeft->setChecked(false);
ui->actionRight->setChecked(true);
ui->actionCenter->setChecked(false);
ui->actionJustify->setChecked(false);
}

void NotepadWindow::on_actionJustify_triggered()
{
ui->textEdit->setAlignment(Qt::AlignJustify);
ui->actionLeft->setChecked(false);
ui->actionRight->setChecked(false);
ui->actionCenter->setChecked(false);
ui->actionJustify->setChecked(true);
}

0

Решение

Как сказано в вашем последнем комментарии, у вас такая же проблема с выравниванием.

Я думаю, что главное в вашем программном обеспечении — этоОбновить«Информация о пользовательском интерфейсе, такая как размер шрифта, выравнивание, полужирный и так далее, когда он отличается.
Это именно то, что делают Microsoft Word и другие писатели.

Основная идея та же, что и раньше, но в более общем виде:

  1. Вызвать currentCharFormatChanged (const QTextCharFormat &е) сигнал чтобы получить информацию о фактическом тексте (жирный, курсив, точка, размер, также ..)
  2. Обновление информации интерфейса пользователя о последней информации (если текст выделен жирным шрифтом, нажмите кнопку жирного шрифта также.)

Поскольку QTextCharFormat предоставляет только информацию о символах, а не о выравнивании, вы должны получить ui->textEdit->alignment() чтобы получить информацию о выравнивании

Таким образом, параллельно, для выравнивания вы делаете то же самое:

  1. Запустить сигнал cursorPositionChanged ()
  2. Обновить кнопки выравнивания пользовательского интерфейса (если выравнивание осталось, проверьте кнопку «выравнивание по левому краю», если по центру, проверьте центр по центру так же ..)

Вот ваш код:

notepadwindow.h: https://pastebin.com/8b5UqnZF

notepadwindow.cpp: https://pastebin.com/ufJPM2Yj


Возможно, я ошибаюсь, но с тем, что я увидел, кажется, что вы действительно не знаете, что делаете.

Я имею в виду, я искал в документе, чтобы найти ответы, которые вам нужны. Я не нашел их напрямую, я должен был попытаться понять, как это работает, и единственное, что я использовал, был документ. Похоже, что вы несколько раз просили людей помочь вам на форумах, и именно это подводит меня к такому выводу.

Я знаю, что вы, конечно, новичок, и, возможно, вы думаете, что поиск в документе — пустая трата времени или что вы ничего не понимаете в нем, но если вы хотите прогрессировать в программировании, вы должны прочитать документацию ( даже если вы ничего не понимаете в этом) и попробуйте сначала простые вещи, чтобы понять, что вы делаете.

Не воспринимайте это как упрек, а скорее как совет: прочитайте документацию, если знаете, что делаете, если нет, начните с более простых вещей.

0

Другие решения

Отредактировано 2 (16.12.2017):

введите описание изображения здесь

Я сказал вам в последней редакции этого поста, что вы должны изменить, и вы сказали, что это не сработало.

Я взял весь твой код и внес изменения, которые я сказал, и он отлично работает для меня.

https://pastebin.com/raw/Y38eLYbK


Отредактировано (15.12.2017):

Итак, я, возможно, понял, что происходит с вашим кодом:

С помощью setFontPointSize () вы меняете текущий размер формата. который представлен с QTextCharFormat.

Итак, в основном у вас есть это:
введите описание изображения здесь

Когда вы устанавливаете курсор на «Hello», он принимает QTextCharFormat, связанный с Hello (fontPoinzeSize, равный 15). Таким образом, ваш верхний правый размер шрифта не влияет на это.

Что вам нужно сделать, это изменить текущий QTextCharFormat на размер, который у вас есть в правом верхнем углу, когда вы поместите курсор в другую позицию, как это:

/*  In your .h */
class NotepadWindow{

/* ... */

private:
int m_actualPointSize;
}/** In your cpp */
NotepadWindow::NotepadWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::NotepadWindow)

{
/* ... */
connect(ui->textEdit, SIGNAL(cursorPositionChanged()), this, SLOT(changeCursorPosPointSize()));
}

void NotepadWindow::onFontSizeChanged(QString selected)
{
m_actualPointSize = selected.toInt();
ui->textEdit->setFontPointSize(m_actualPointSize);
}

void NotepadWindow::changeCursorPosPointSize()
{
QTextCharFormat format;
format.setFontPointSize(m_actualPointSize); // Put the variable that is associated with
ui->textEdit->mergeCurrentCharFormat(format);
}

Старый пост:

Возможно, QTextEdit (ui-> textEdit) не обновлен, и вам может потребоваться вызвать функцию обновления.

Попробуйте это так:

void NotepadWindow::onFontSizeChanged(QString selected)
{
ui->textEdit->setFontPointSize(selected.toInt());
ui->textEdit->update(); // Or ->repaint();
}

Если это не сработает, скажите, пожалуйста, какой метод вызывается этой строкой:

connect(ui->textEdit, SIGNAL(QTextEdit::cursorPositionChanged()), this, SLOT());

потому что SLOT () указывает на любой метод.

0

По вопросам рекламы [email protected]