⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 richtexteditor.cpp

📁 qt-x11-opensource-src-4.1.4.tar.gz源码
💻 CPP
字号:
/******************************************************************************** Copyright (C) 1992-2006 Trolltech ASA. All rights reserved.**** This file is part of the Qt Designer of the Qt Toolkit.**** This file may be used under the terms of the GNU General Public** License version 2.0 as published by the Free Software Foundation** and appearing in the file LICENSE.GPL included in the packaging of** this file.  Please review the following information to ensure GNU** General Public Licensing requirements will be met:** http://www.trolltech.com/products/qt/opensource.html**** If you are unsure which license is appropriate for your use, please** review the following information:** http://www.trolltech.com/products/qt/licensing.html or contact the** sales department at sales@trolltech.com.**** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.******************************************************************************/#include <QtCore/QPointer>#include <QtCore/QMap>#include <QtGui/QToolBar>#include <QtGui/QComboBox>#include <QtGui/QAction>#include <QtGui/QTextCursor>#include <QtGui/QPainter>#include <QtGui/QIcon>#include <QtGui/QMoveEvent>#include <QtGui/QTextDocument>#include <QtGui/QTextBlock>#include <QtGui/QVBoxLayout>#include <QtGui/QHBoxLayout>#include <QtGui/QPushButton>#include <QtCore/qdebug.h>#include "iconloader_p.h"#include "richtexteditor_p.h"static bool operator < (const QColor &c1, const QColor &c2){    if (c1.red() != c2.red())        return c1.red() < c2.red();    if (c1.green() != c2.green())        return c1.green() < c2.green();    return c1.blue() < c2.blue();}namespace qdesigner_internal {class RichTextEditorToolBar : public QToolBar{    Q_OBJECTpublic:    RichTextEditorToolBar(RichTextEditor *editor, QWidget *parent = 0);public slots:    void updateActions();private slots:    void sizeInputActivated(const QString &size);    void colorInputActivated(const QString &color);private:    QAction *m_bold_action;    QAction *m_italic_action;    QAction *m_underline_action;    QComboBox *m_font_size_input;    QComboBox *m_color_input;    QPointer<RichTextEditor> m_editor;    typedef QMap<QColor, QString> ColorMap;    ColorMap m_color_map;};static QAction *createCheckableAction(const QIcon &icon, const QString &text,                                    QObject *receiver, const char *slot,                                    QObject *parent = 0){    QAction *result = new QAction(parent);    result->setIcon(icon);    result->setText(text);    result->setCheckable(true);    result->setChecked(false);    QObject::connect(result, SIGNAL(triggered(bool)), receiver, slot);    return result;}static QIcon iconForColor(const QColor &color){    QPixmap result(12, 12);    QPainter painter(&result);    painter.setPen(Qt::black);    painter.setBrush(color);    painter.drawRect(0, 0, result.width() - 1, result.height() - 1);    painter.end();    return QIcon(result);}RichTextEditorToolBar::RichTextEditorToolBar(RichTextEditor *editor,                                                QWidget *parent)    : QToolBar(parent){    m_editor = editor;    m_bold_action = createCheckableAction(createIconSet(QLatin1String("textbold.png")),            tr("Bold"), editor, SLOT(setFontBold(bool)), this);    m_bold_action->setShortcut(tr("CTRL+b"));    addAction(m_bold_action);    m_italic_action = createCheckableAction(createIconSet(QLatin1String("textitalic.png")),            tr("Italic"), editor, SLOT(setFontItalic(bool)), this);    m_italic_action->setShortcut(tr("CTRL+I"));    addAction(m_italic_action);    m_underline_action = createCheckableAction(createIconSet(QLatin1String("textunder.png")),            tr("Underline"), editor, SLOT(setFontUnderline(bool)), this);    m_underline_action->setShortcut(tr("CTRL+U"));    addAction(m_underline_action);    m_font_size_input = new QComboBox(this);    m_font_size_input->setEditable(false);    for (int i = 4; i < 30; ++i)        m_font_size_input->addItem(QString::number(i));    connect(m_font_size_input, SIGNAL(activated(QString)),                this, SLOT(sizeInputActivated(QString)));    addWidget(m_font_size_input);    QStringList color_names = QColor::colorNames();    color_names.removeAll(QLatin1String("transparent"));    foreach (QString color, color_names)        m_color_map.insert(QColor(color), color);    m_color_input = new QComboBox(this);    foreach (QString color, color_names)        m_color_input->addItem(iconForColor(color), color);    connect(m_color_input, SIGNAL(activated(QString)),                this, SLOT(colorInputActivated(QString)));    addWidget(m_color_input);    connect(editor, SIGNAL(textChanged()), this, SLOT(updateActions()));    updateActions();}void RichTextEditorToolBar::colorInputActivated(const QString &s){    QColor color(s);    if (!color.isValid())        return;    m_editor->setTextColor(color);    m_editor->setFocus();}void RichTextEditorToolBar::sizeInputActivated(const QString &size){    if (m_editor == 0)        return;    bool ok;    int i = size.toInt(&ok);    if (!ok)        return;    m_editor->setFontPointSize(i);    m_editor->setFocus();}void RichTextEditorToolBar::updateActions(){    if (m_editor == 0) {        setEnabled(false);        return;    }    QTextCursor cursor = m_editor->textCursor();    QTextCharFormat char_format = cursor.charFormat();    m_bold_action->setChecked(char_format.fontWeight() == QFont::Bold);    m_italic_action->setChecked(char_format.fontItalic());    m_underline_action->setChecked(char_format.fontUnderline());    int size = (int) char_format.fontPointSize();    if (size == 0) // workaround for a bug in QTextEdit        size = (int) m_editor->document()->defaultFont().pointSize();    int idx = m_font_size_input->findText(QString::number(size));    if (idx != -1)        m_font_size_input->setCurrentIndex(idx);    QString color = m_color_map.value(m_editor->textColor());    idx = m_color_input->findText(color);    m_color_input->setCurrentIndex(idx);}RichTextEditor::RichTextEditor(QWidget *parent)    : QTextEdit(parent){    connect(this, SIGNAL(currentCharFormatChanged(QTextCharFormat)),                this, SIGNAL(textChanged()));}QToolBar *RichTextEditor::createToolBar(QWidget *parent){    return new RichTextEditorToolBar(this, parent);}void RichTextEditor::setFontBold(bool b){    if (b)        setFontWeight(QFont::Bold);    else        setFontWeight(QFont::Normal);}void RichTextEditor::setFontPointSize(double d){    QTextEdit::setFontPointSize(qreal(d));}void RichTextEditor::setText(const QString &text){    if (Qt::mightBeRichText(text))        setHtml(text);    else        setPlainText(text);}void RichTextEditor::setDefaultFont(const QFont &font){    document()->setDefaultFont(font);    if (font.pointSize() > 0)        setFontPointSize(font.pointSize());    else        setFontPointSize(QFontInfo(font).pointSize());    emit textChanged();}static bool compareFontSizes(const QFont &font1, const QFont &font2){    int ps1 = font1.pointSize();    if (ps1 == -1 && font1.pointSizeF() > 0)        ps1 = (int) font1.pointSizeF();    int ps2 = font2.pointSize();    if (ps2 == -1 && font2.pointSizeF() > 0)        ps2 = (int) font2.pointSizeF();    if (ps1 != -1 || ps2 != -1)        return ps1 == ps2;    return font1.pixelSize() == font2.pixelSize();}static inline bool compareFonts(const QFont &font1, const QFont &font2){    return font1.family() == font2.family()            && compareFontSizes(font1, font2)            && font1.bold() == font2.bold()            && font1.italic() == font2.italic()            && font1.overline() == font2.overline()            && font1.underline() == font2.underline()            && font1.strikeOut() == font2.strikeOut();}Qt::TextFormat RichTextEditor::detectFormat() const{    Qt::TextFormat result = Qt::PlainText;    QFont default_font = document()->defaultFont();    QTextCursor cursor(document()->begin());    cursor.movePosition(QTextCursor::End);    while (!cursor.atStart()) {        QFont font = cursor.charFormat().font();        if (!compareFonts(font, default_font)) {            result = Qt::RichText;            break;        }        cursor.movePosition(QTextCursor::Left);    }    return result;};QString RichTextEditor::text(Qt::TextFormat format) const{    bool richtext = true;    if (format == Qt::PlainText)        richtext = false;    else if (format != Qt::RichText)        richtext = detectFormat() == Qt::RichText;    if (richtext)        return toHtml();    else        return toPlainText();}RichTextEditorDialog::RichTextEditorDialog(QWidget *parent)    : QDialog(parent){    setWindowTitle(tr("Edit text"));    QVBoxLayout *layout = new QVBoxLayout(this);    layout->setMargin(1);    m_editor = new RichTextEditor(this);    QToolBar *tool_bar = m_editor->createToolBar(this);    tool_bar->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Minimum);    layout->addWidget(tool_bar);    layout->addWidget(m_editor);    QHBoxLayout *layout2 = new QHBoxLayout;    layout->addLayout(layout2);    layout2->addStretch();    QPushButton *cancel_button = new QPushButton(tr("&Cancel"), this);    connect(cancel_button, SIGNAL(clicked()), this, SLOT(reject()));    QPushButton *ok_button = new QPushButton(tr("&OK"), this);    connect(ok_button, SIGNAL(clicked()), this, SLOT(accept()));    ok_button->setDefault(true);    layout2->addWidget(ok_button);    layout2->addWidget(cancel_button);}RichTextEditor *RichTextEditorDialog::editor(){    return m_editor;}} // namespace qdesigner_internal#include "richtexteditor.moc"

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -