QTextEdit::cursorPositionChanged() -> 与QComboBox和按钮同步字体样式
QTextEdit::cursorPositionChanged() -> synchronization font style with QComboBox and buttons
我遇到了问题。我正在输入字体大小为 15 的文本:"Hello"。然后我输入字体大小为 20 的文本:"World"。当我将光标的位置改回第一行时,我的字体大小将从 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);
}
已编辑 2 (16.12.2017):
我在最后一次编辑时告诉你post你必须改变什么,你说它不起作用。
我采用了您的所有代码并进行了我所说的更改,它非常适合我。
https://pastebin.com/raw/Y38eLYbK
已编辑 (15.12.2017):
所以,我可能明白你的代码是怎么回事了:
By setFontPointSize(), your are changing the current format size. that is represented with a QTextCharFormat.
所以基本上你有这个:
当您将光标放在 "Hello" 上时,它采用与 Hello 关联的 QTextCharFormat(等于 15 的 fontPoinzeSize)。所以你右上角的字体大小对它没有影响。
您需要做的是将当前的 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);
}
旧post:
可能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() 指向任何方法。
正如您在上一条评论中所说,您在对齐方面也遇到了同样的问题。
我认为在您的软件中要做的主要事情是“更新” UI 字体大小、对齐方式、粗体等信息不同的。
这正是 Microsoft Word 和其他作者所做的。
主要思想与之前相同,但更通用的方式是:
- 触发 currentCharFormatChanged(const QTextCharFormat &f) 信号 以获取有关实际文本的信息(粗体、斜体 pointSize aso..)
- 更新UI关于最后信息的信息(如果文本是粗体,请检查粗体按钮aso..)
因为 QTextCharFormat 只提供有关字符的信息而不是对齐信息,所以您必须 ui->textEdit->alignment()
才能获取对齐信息
所以并行地,为了对齐你做同样的事情:
- 触发 cursorPositionChanged() 信号
- 更新UI个对齐按钮(如果对齐是左对齐,勾选“左对齐”按钮,如果居中,勾选居中的一个..)
这是您的代码:
notepadwindow.h : https://pastebin.com/8b5UqnZF
notepadwindow.cpp: https://pastebin.com/ufJPM2Yj
学习阅读文档或从更简单的事情开始
我可能错了,但就我所见,你似乎并不真正知道自己在做什么。
我的意思是,我搜索了文档以找到您需要的回复。我没有直接找到它们,我不得不尝试了解它是如何工作的,我唯一使用的是文档。看来你在论坛上多次请人帮助你,这就是我得出这个结论的原因。
我知道你肯定是个初学者,可能你觉得看文档很浪费时间,或者你看不懂文档,但是如果你想在编程上有所进步,你必须阅读文档(即使您不了解其中的任何内容)并在开始时尝试简单的事情以了解您在做什么。
不要把它当成一种责备,而更像是一种建议:如果您知道自己在做什么,请阅读文档,否则,请从更简单的事情开始。
我遇到了问题。我正在输入字体大小为 15 的文本:"Hello"。然后我输入字体大小为 20 的文本:"World"。当我将光标的位置改回第一行时,我的字体大小将从 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);
}
已编辑 2 (16.12.2017):
我在最后一次编辑时告诉你post你必须改变什么,你说它不起作用。
我采用了您的所有代码并进行了我所说的更改,它非常适合我。
https://pastebin.com/raw/Y38eLYbK
已编辑 (15.12.2017):
所以,我可能明白你的代码是怎么回事了:
By setFontPointSize(), your are changing the current format size. that is represented with a QTextCharFormat.
所以基本上你有这个:
当您将光标放在 "Hello" 上时,它采用与 Hello 关联的 QTextCharFormat(等于 15 的 fontPoinzeSize)。所以你右上角的字体大小对它没有影响。
您需要做的是将当前的 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);
}
旧post:
可能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() 指向任何方法。
正如您在上一条评论中所说,您在对齐方面也遇到了同样的问题。
我认为在您的软件中要做的主要事情是“更新” UI 字体大小、对齐方式、粗体等信息不同的。 这正是 Microsoft Word 和其他作者所做的。
主要思想与之前相同,但更通用的方式是:
- 触发 currentCharFormatChanged(const QTextCharFormat &f) 信号 以获取有关实际文本的信息(粗体、斜体 pointSize aso..)
- 更新UI关于最后信息的信息(如果文本是粗体,请检查粗体按钮aso..)
因为 QTextCharFormat 只提供有关字符的信息而不是对齐信息,所以您必须 ui->textEdit->alignment()
才能获取对齐信息
所以并行地,为了对齐你做同样的事情:
- 触发 cursorPositionChanged() 信号
- 更新UI个对齐按钮(如果对齐是左对齐,勾选“左对齐”按钮,如果居中,勾选居中的一个..)
这是您的代码:
notepadwindow.h : https://pastebin.com/8b5UqnZF
notepadwindow.cpp: https://pastebin.com/ufJPM2Yj
学习阅读文档或从更简单的事情开始
我可能错了,但就我所见,你似乎并不真正知道自己在做什么。
我的意思是,我搜索了文档以找到您需要的回复。我没有直接找到它们,我不得不尝试了解它是如何工作的,我唯一使用的是文档。看来你在论坛上多次请人帮助你,这就是我得出这个结论的原因。
我知道你肯定是个初学者,可能你觉得看文档很浪费时间,或者你看不懂文档,但是如果你想在编程上有所进步,你必须阅读文档(即使您不了解其中的任何内容)并在开始时尝试简单的事情以了解您在做什么。