У меня проблема. Я набираю текст с размером шрифта 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);
}
Как сказано в вашем последнем комментарии, у вас такая же проблема с выравниванием.
Я думаю, что главное в вашем программном обеспечении — этоОбновить«Информация о пользовательском интерфейсе, такая как размер шрифта, выравнивание, полужирный и так далее, когда он отличается.
Это именно то, что делают Microsoft Word и другие писатели.
Основная идея та же, что и раньше, но в более общем виде:
Поскольку QTextCharFormat предоставляет только информацию о символах, а не о выравнивании, вы должны получить ui->textEdit->alignment()
чтобы получить информацию о выравнивании
Таким образом, параллельно, для выравнивания вы делаете то же самое:
Вот ваш код:
notepadwindow.h: https://pastebin.com/8b5UqnZF
notepadwindow.cpp: https://pastebin.com/ufJPM2Yj
Возможно, я ошибаюсь, но с тем, что я увидел, кажется, что вы действительно не знаете, что делаете.
Я имею в виду, я искал в документе, чтобы найти ответы, которые вам нужны. Я не нашел их напрямую, я должен был попытаться понять, как это работает, и единственное, что я использовал, был документ. Похоже, что вы несколько раз просили людей помочь вам на форумах, и именно это подводит меня к такому выводу.
Я знаю, что вы, конечно, новичок, и, возможно, вы думаете, что поиск в документе — пустая трата времени или что вы ничего не понимаете в нем, но если вы хотите прогрессировать в программировании, вы должны прочитать документацию ( даже если вы ничего не понимаете в этом) и попробуйте сначала простые вещи, чтобы понять, что вы делаете.
Я сказал вам в последней редакции этого поста, что вы должны изменить, и вы сказали, что это не сработало.
Я взял весь твой код и внес изменения, которые я сказал, и он отлично работает для меня.
https://pastebin.com/raw/Y38eLYbK
Итак, я, возможно, понял, что происходит с вашим кодом:
С помощью 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 () указывает на любой метод.