繁体   English   中英

QTextEdit :: cursorPositionChanged()->使用QComboBox和按钮的同步字体样式

[英]QTextEdit::cursorPositionChanged() -> synchronization font style with QComboBox and buttons

我有问题 我输入的字体大小为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);
}

编辑2(16.12.2017):

在此处输入图片说明

我在这篇文章的最后编辑中说过您必须更改的内容,但您说它没有用。

我拿走了您所有的代码,进行了我说的更改,它对我来说非常有效。

https://pastebin.com/raw/Y38eLYbK


编辑(15.12.2017):

因此,我也许理解您的代码发生了什么:

通过setFontPointSize(),您正在更改当前格式的大小。 QTextCharFormat表示。

所以基本上你有这个: 在此处输入图片说明

当您将光标放在“ Hello”上时,它将采用与Hello相关联的QTextCharFormat(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()指向任何方法。

就像您在最后一条评论中所说的那样,您在对齐方面存在相同的问题。

我认为您的软件中要做的主要事情是“ 更新 ” UI信息,例如字体大小,对齐方式,粗体等等。 这正是Microsoft Word和其他作者所做的。

主要思想与以前相同,但是以更常见的方式:

  1. 触发currentCharFormatChanged(const QTextCharFormat&f) 信号以获取有关实际文本的信息(粗体,斜体pointSize as ..)
  2. 更新有关最后信息的UI信息(如果文本为粗体,则也请选中粗体按钮。)

由于QTextCharFormat仅提供有关字符的信息,而不提供对齐信息,因此必须获取ui->textEdit->alignment()以获得对齐信息。

因此,并行进行对齐时,请执行以下操作:

  1. 触发cursorPositionChanged()信号
  2. 更新UI对齐按钮(如果左对齐,请选中“左对齐”按钮,如果居中,请选中居中对齐。)

这是您的代码:

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

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


学习阅读文档或从简单的事情开始

我可能是错的,但根据我所看到的,看来您并不真正知道自己在做什么。

我的意思是,我搜索了文档以找到所需的回复。 我没有直接找到它们,我不得不尝试了解它是如何工作的,而我唯一使用的是文档。 您似乎多次要求人们在论坛上为您提供帮助,这就是使我得出这一结论的原因。

我知道您当然是一个初学者,也许您认为在doc上进行搜索是浪费时间,或者您不了解其中的任何内容,但是如果您想在编程方面取得进步,则必须阅读文档(即使您对此一无所知),也可以从一开始就尝试简单的方法来了解自己在做什么。

不要把它当成指责,而应该像是一条建议:如果您知道自己的工作,请阅读文档,否则,请从简单的事情开始。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM