41#include <QApplication>
46#include <QFontDatabase>
47#include <QImageReader>
48#include <QInputDialog>
52#include <QNetworkRequest>
60#include "moc_qgsrichtexteditor.cpp"
62using namespace Qt::StringLiterals;
71 QVBoxLayout *sourceLayout =
new QVBoxLayout();
72 sourceLayout->setContentsMargins( 0, 0, 0, 0 );
75 sourceLayout->addWidget( codeEditorWidget );
76 mPageSourceEdit->setLayout( sourceLayout );
80 connect( mTextEdit, &QTextEdit::currentCharFormatChanged,
this, &QgsRichTextEditor::slotCurrentCharFormatChanged );
81 connect( mTextEdit, &QTextEdit::cursorPositionChanged,
this, &QgsRichTextEditor::slotCursorPositionChanged );
84 mActionUndo->setShortcut( QKeySequence::Undo );
85 mActionRedo->setShortcut( QKeySequence::Redo );
87 connect( mTextEdit->document(), &QTextDocument::undoAvailable, mActionUndo, &QAction::setEnabled );
88 connect( mTextEdit->document(), &QTextDocument::redoAvailable, mActionRedo, &QAction::setEnabled );
90 mActionUndo->setEnabled( mTextEdit->document()->isUndoAvailable() );
91 mActionRedo->setEnabled( mTextEdit->document()->isRedoAvailable() );
93 connect( mActionUndo, &QAction::triggered, mTextEdit, &QTextEdit::undo );
94 connect( mActionRedo, &QAction::triggered, mTextEdit, &QTextEdit::redo );
97 mActionCut->setShortcut( QKeySequence::Cut );
98 mActionCopy->setShortcut( QKeySequence::Copy );
99 mActionPaste->setShortcut( QKeySequence::Paste );
101 mActionCut->setEnabled(
false );
102 mActionCopy->setEnabled(
false );
104 connect( mActionCut, &QAction::triggered, mTextEdit, &QTextEdit::cut );
105 connect( mActionCopy, &QAction::triggered, mTextEdit, &QTextEdit::copy );
106 connect( mActionPaste, &QAction::triggered, mTextEdit, &QTextEdit::paste );
108 connect( mTextEdit, &QTextEdit::copyAvailable, mActionCut, &QAction::setEnabled );
109 connect( mTextEdit, &QTextEdit::copyAvailable, mActionCopy, &QAction::setEnabled );
111#ifndef QT_NO_CLIPBOARD
112 connect( QApplication::clipboard(), &QClipboard::dataChanged,
this, &QgsRichTextEditor::slotClipboardDataChanged );
116 mActionInsertLink->setShortcut( QKeySequence( u
"CTRL+L"_s ) );
117 connect( mActionInsertLink, &QAction::triggered,
this, &QgsRichTextEditor::textLink );
118 connect( mActionInsertImageFromUrl, &QAction::triggered,
this, &QgsRichTextEditor::insertImageFromUrl );
121 mActionBold->setShortcut( QKeySequence( u
"CTRL+B"_s ) );
122 mActionItalic->setShortcut( QKeySequence( u
"CTRL+I"_s ) );
123 mActionUnderline->setShortcut( QKeySequence( u
"CTRL+U"_s ) );
125 connect( mActionBold, &QAction::triggered,
this, &QgsRichTextEditor::textBold );
126 connect( mActionItalic, &QAction::triggered,
this, &QgsRichTextEditor::textItalic );
127 connect( mActionUnderline, &QAction::triggered,
this, &QgsRichTextEditor::textUnderline );
128 connect( mActionStrikeOut, &QAction::triggered,
this, &QgsRichTextEditor::textStrikeout );
131 mActionBulletList->setShortcut( QKeySequence( u
"CTRL+-"_s ) );
132 mActionOrderedList->setShortcut( QKeySequence( u
"CTRL+="_s ) );
133 connect( mActionBulletList, &QAction::triggered,
this, &QgsRichTextEditor::listBullet );
134 connect( mActionOrderedList, &QAction::triggered,
this, &QgsRichTextEditor::listOrdered );
137 mActionDecreaseIndent->setShortcut( QKeySequence( u
"CTRL+,"_s ) );
138 mActionIncreaseIndent->setShortcut( QKeySequence( u
"CTRL+."_s ) );
139 connect( mActionIncreaseIndent, &QAction::triggered,
this, &QgsRichTextEditor::increaseIndentation );
140 connect( mActionDecreaseIndent, &QAction::triggered,
this, &QgsRichTextEditor::decreaseIndentation );
142 connect( mActionEditSource, &QAction::toggled,
this, &QgsRichTextEditor::editSource );
145 connect( mActionInsertImage, &QAction::triggered,
this, &QgsRichTextEditor::insertImage );
149 fontChanged( mTextEdit->font() );
159 delete mFontSizeCombo;
160 mFontSizeCombo =
nullptr;
161 delete mParagraphStyleCombo;
162 mParagraphStyleCombo =
nullptr;
163 delete mForeColorButton;
164 mForeColorButton =
nullptr;
165 delete mBackColorButton;
166 mBackColorButton =
nullptr;
171 mParagraphStyleCombo =
new QComboBox();
172 mParagraphStyleCombo->addItem( tr(
"Standard" ), ParagraphStandard );
173 mParagraphStyleCombo->addItem( tr(
"Heading 1" ), ParagraphHeading1 );
174 mParagraphStyleCombo->addItem( tr(
"Heading 2" ), ParagraphHeading2 );
175 mParagraphStyleCombo->addItem( tr(
"Heading 3" ), ParagraphHeading3 );
176 mParagraphStyleCombo->addItem( tr(
"Heading 4" ), ParagraphHeading4 );
177 mParagraphStyleCombo->addItem( tr(
"Monospace" ), ParagraphMonospace );
179 connect( mParagraphStyleCombo, qOverload<int>( &QComboBox::activated ),
this, &QgsRichTextEditor::textStyle );
182 mToolBar->addWidget( mParagraphStyleCombo );
185 mToolBar->addAction( mActionUndo );
186 mToolBar->addAction( mActionRedo );
187 mToolBar->addAction( mActionCut );
188 mToolBar->addAction( mActionCopy );
189 mToolBar->addAction( mActionPaste );
192 mFontSizeCombo =
new QComboBox();
193 mFontSizeCombo->setEditable(
true );
195 const QList<int> sizes = QFontDatabase::standardSizes();
196 for (
const int size : sizes )
197 mFontSizeCombo->addItem( QString::number( size ), size );
199 mFontSizeCombo->setCurrentIndex( mFontSizeCombo->findData( QApplication::font().pointSize() ) );
200 connect( mFontSizeCombo, &QComboBox::textActivated,
this, &QgsRichTextEditor::textSize );
204 mToolBar->addSeparator();
205 mToolBar->addWidget( mFontSizeCombo );
206 mToolBar->addAction( mActionBold );
207 mToolBar->addAction( mActionItalic );
208 mToolBar->addAction( mActionUnderline );
209 mToolBar->addAction( mActionStrikeOut );
211 mToolBar->addSeparator();
216 mForeColorButton->setAllowOpacity(
false );
217 mForeColorButton->setColorDialogTitle( tr(
"Foreground Color" ) );
218 mForeColorButton->setColor( palette().windowText().color() );
219 mForeColorButton->setShowNoColor(
false );
220 mForeColorButton->setToolTip( tr(
"Foreground color" ) );
221 mForeColorButton->setMinimumWidth( QFontMetrics( font() ).horizontalAdvance( u
"x"_s ) * 10 );
222 mForeColorButton->setSizePolicy( QSizePolicy::Preferred, QSizePolicy::Fixed );
228 mToolBar->addWidget( mForeColorButton );
233 mBackColorButton->setAllowOpacity(
false );
234 mBackColorButton->setColorDialogTitle( tr(
"Background Color" ) );
235 mBackColorButton->setToolTip( tr(
"Background color" ) );
236 mBackColorButton->setShowNull(
true, tr(
"No Background Color" ) );
237 mBackColorButton->setToNull();
238 mBackColorButton->setSizePolicy( QSizePolicy::Preferred, QSizePolicy::Fixed );
239 mBackColorButton->setMinimumWidth( QFontMetrics( font() ).horizontalAdvance( u
"x"_s ) * 10 );
244 mToolBar->addWidget( mBackColorButton );
245 mToolBar->addAction( mActionBulletList );
246 mToolBar->addAction( mActionOrderedList );
247 mToolBar->addAction( mActionDecreaseIndent );
248 mToolBar->addAction( mActionIncreaseIndent );
249 mToolBar->addSeparator();
250 mToolBar->addAction( mActionInsertLink );
251 QToolButton *insertImageButton =
new QToolButton( mToolBar );
252 insertImageButton->setDefaultAction( mActionInsertImage );
253 insertImageButton->setPopupMode( QToolButton::MenuButtonPopup );
254 QMenu *insertImageMenu =
new QMenu( insertImageButton );
255 insertImageMenu->addAction( mActionInsertImageFromUrl );
256 insertImageButton->setMenu( insertImageMenu );
257 mToolBar->addWidget( insertImageButton );
261 mToolBar->addAction( mActionEditSource );
264 QMenu *menu =
new QMenu(
this );
267 QAction *removeFormat =
new QAction( tr(
"Remove Character Formatting" ), menu );
268 removeFormat->setShortcut( QKeySequence( u
"CTRL+M"_s ) );
269 connect( removeFormat, &QAction::triggered,
this, &QgsRichTextEditor::textRemoveFormat );
270 mTextEdit->addAction( removeFormat );
272 QAction *removeAllFormat =
new QAction( tr(
"Remove all Formatting" ), menu );
273 connect( removeAllFormat, &QAction::triggered,
this, &QgsRichTextEditor::textRemoveAllFormat );
274 mTextEdit->addAction( removeAllFormat );
275 menu->addAction( removeAllFormat );
276 menu->addAction( removeFormat );
279 QAction *clearText =
new QAction( tr(
"Clear all Content" ), menu );
281 mTextEdit->addAction( clearText );
283 menu->addAction( clearText );
285 QToolButton *menuButton =
new QToolButton( mToolBar );
286 menuButton->setMenu( menu );
287 menuButton->setPopupMode( QToolButton::InstantPopup );
288 menuButton->setToolTip( tr(
"Advanced Options" ) );
289 menuButton->setText( u
"…"_s );
291 QWidget *spacer =
new QWidget();
292 spacer->setSizePolicy( QSizePolicy::Expanding, QSizePolicy::Expanding );
293 mToolBar->addWidget( spacer );
294 mToolBar->addWidget( menuButton );
304 switch ( mStackedWidget->currentIndex() )
307 return mTextEdit->toPlainText();
311 mTextEdit->setText( mSourceEdit->text() );
312 return mTextEdit->toPlainText();
322 switch ( mStackedWidget->currentIndex() )
325 return mTextEdit->toHtml();
328 return mSourceEdit->text();
336void QgsRichTextEditor::editSource(
bool enabled )
338 if ( enabled && mStackedWidget->currentIndex() == 0 )
340 mSourceEdit->
setText( mTextEdit->toHtml() );
341 mStackedWidget->setCurrentIndex( 1 );
343 else if ( !enabled && mStackedWidget->currentIndex() == 1 )
345 mTextEdit->setHtml( mSourceEdit->text() );
346 mStackedWidget->setCurrentIndex( 0 );
347 mSourceEdit->clear();
351 mFontSizeCombo->setEnabled( !enabled );
352 mParagraphStyleCombo->setEnabled( !enabled );
353 mForeColorButton->setEnabled( !enabled );
354 mBackColorButton->setEnabled( !enabled );
355 mActionUndo->setEnabled( !enabled );
356 mActionRedo->setEnabled( !enabled );
357 mActionCut->setEnabled( !enabled );
358 mActionCopy->setEnabled( !enabled );
359 mActionPaste->setEnabled( !enabled );
360 mActionInsertLink->setEnabled( !enabled );
361 mActionBold->setEnabled( !enabled );
362 mActionItalic->setEnabled( !enabled );
363 mActionUnderline->setEnabled( !enabled );
364 mActionStrikeOut->setEnabled( !enabled );
365 mActionBulletList->setEnabled( !enabled );
366 mActionOrderedList->setEnabled( !enabled );
367 mActionDecreaseIndent->setEnabled( !enabled );
368 mActionIncreaseIndent->setEnabled( !enabled );
369 mActionInsertImage->setEnabled( !enabled );
377void QgsRichTextEditor::textRemoveFormat()
379 QTextCharFormat format;
380 format.setFontWeight( QFont::Normal );
381 format.setFontUnderline(
false );
382 format.setFontStrikeOut(
false );
383 format.setFontItalic(
false );
384 format.setFontPointSize( 9 );
386 mActionBold->setChecked(
false );
387 mActionUnderline->setChecked(
false );
388 mActionItalic->setChecked(
false );
389 mActionStrikeOut->setChecked(
false );
390 mFontSizeCombo->setCurrentIndex( mFontSizeCombo->findData( 9 ) );
392 format.clearBackground();
394 mergeFormatOnWordOrSelection( format );
397void QgsRichTextEditor::textRemoveAllFormat()
399 mActionBold->setChecked(
false );
400 mActionUnderline->setChecked(
false );
401 mActionItalic->setChecked(
false );
402 mActionStrikeOut->setChecked(
false );
403 mFontSizeCombo->setCurrentIndex( mFontSizeCombo->findData( 9 ) );
404 const QString text = mTextEdit->toPlainText();
405 mTextEdit->setPlainText( text );
408void QgsRichTextEditor::textBold()
410 QTextCharFormat format;
411 format.setFontWeight( mActionBold->isChecked() ? QFont::Bold : QFont::Normal );
412 mergeFormatOnWordOrSelection( format );
417 mTextEdit->setFocus( Qt::TabFocusReason );
420void QgsRichTextEditor::textUnderline()
422 QTextCharFormat format;
423 format.setFontUnderline( mActionUnderline->isChecked() );
424 mergeFormatOnWordOrSelection( format );
427void QgsRichTextEditor::textItalic()
429 QTextCharFormat format;
430 format.setFontItalic( mActionItalic->isChecked() );
431 mergeFormatOnWordOrSelection( format );
434void QgsRichTextEditor::textStrikeout()
436 QTextCharFormat format;
437 format.setFontStrikeOut( mActionStrikeOut->isChecked() );
438 mergeFormatOnWordOrSelection( format );
441void QgsRichTextEditor::textSize(
const QString &p )
443 const qreal pointSize = p.toDouble();
444 if ( p.toFloat() > 0 )
446 QTextCharFormat format;
447 format.setFontPointSize( pointSize );
448 mergeFormatOnWordOrSelection( format );
452void QgsRichTextEditor::textLink(
bool checked )
455 QTextCharFormat format;
458 const QString url = mTextEdit->currentCharFormat().anchorHref();
460 const QString newUrl = QInputDialog::getText(
this, tr(
"Create a Link" ), tr(
"Link URL:" ), QLineEdit::Normal, url, &ok );
463 format.setAnchor(
true );
464 format.setAnchorHref( newUrl );
465 format.setForeground( palette().color( QPalette::Link ) );
466 format.setFontUnderline(
true );
479 format.setAnchor(
false );
480 format.setForeground( palette().color( QPalette::Text ) );
481 format.setFontUnderline(
false );
483 mergeFormatOnWordOrSelection( format );
486void QgsRichTextEditor::textStyle(
int index )
488 QTextCursor cursor = mTextEdit->textCursor();
489 cursor.beginEditBlock();
492 if ( !cursor.hasSelection() )
494 cursor.select( QTextCursor::BlockUnderCursor );
496 QTextCharFormat format;
497 cursor.setCharFormat( format );
498 mTextEdit->setCurrentCharFormat( format );
500 const ParagraphItems style =
static_cast<ParagraphItems
>( mParagraphStyleCombo->itemData( index ).toInt() );
504 case QgsRichTextEditor::ParagraphStandard:
507 case QgsRichTextEditor::ParagraphHeading1:
508 format.setFontPointSize( mFontSizeH1 );
509 format.setFontWeight( QFont::Bold );
512 case QgsRichTextEditor::ParagraphHeading2:
513 format.setFontPointSize( mFontSizeH2 );
514 format.setFontWeight( QFont::Bold );
515 format.setFontItalic(
true );
518 case QgsRichTextEditor::ParagraphHeading3:
519 format.setFontPointSize( mFontSizeH3 );
520 format.setFontWeight( QFont::Bold );
523 case QgsRichTextEditor::ParagraphHeading4:
524 format.setFontPointSize( mFontSizeH4 );
525 format.setFontWeight( QFont::Bold );
526 format.setFontItalic(
true );
529 case QgsRichTextEditor::ParagraphMonospace:
531 format = cursor.charFormat();
532 format.setFontFamily( mMonospaceFontFamily );
533 format.setFontStyleHint( QFont::Monospace );
534 format.setFontFixedPitch(
true );
539 cursor.setCharFormat( format );
540 mTextEdit->setCurrentCharFormat( format );
542 cursor.endEditBlock();
545void QgsRichTextEditor::textFgColor()
547 QTextCharFormat format;
548 format.setForeground( mForeColorButton->color() );
549 mergeFormatOnWordOrSelection( format );
552void QgsRichTextEditor::textBgColor()
554 QTextCharFormat format;
555 const QColor col = mBackColorButton->color();
558 format.setBackground( col );
562 format.clearBackground();
564 mergeFormatOnWordOrSelection( format );
567void QgsRichTextEditor::listBullet(
bool checked )
571 mActionOrderedList->setChecked(
false );
573 list( checked, QTextListFormat::ListDisc );
576void QgsRichTextEditor::listOrdered(
bool checked )
580 mActionBulletList->setChecked(
false );
582 list( checked, QTextListFormat::ListDecimal );
585void QgsRichTextEditor::list(
bool checked, QTextListFormat::Style style )
587 QTextCursor cursor = mTextEdit->textCursor();
588 cursor.beginEditBlock();
591 const QTextBlockFormat originalFormat = cursor.blockFormat();
592 QTextBlockFormat format;
593 format.setIndent( originalFormat.indent() );
594 cursor.setBlockFormat( format );
598 QTextListFormat listFormat;
599 if ( cursor.currentList() )
601 listFormat = cursor.currentList()->format();
603 listFormat.setStyle( style );
604 cursor.createList( listFormat );
606 cursor.endEditBlock();
609void QgsRichTextEditor::mergeFormatOnWordOrSelection(
const QTextCharFormat &format )
611 QTextCursor cursor = mTextEdit->textCursor();
612 if ( !cursor.hasSelection() )
614 cursor.select( QTextCursor::WordUnderCursor );
616 cursor.mergeCharFormat( format );
617 mTextEdit->mergeCurrentCharFormat( format );
618 mTextEdit->setFocus( Qt::TabFocusReason );
621void QgsRichTextEditor::slotCursorPositionChanged()
623 QTextList *l = mTextEdit->textCursor().currentList();
624 if ( mLastBlockList && ( l == mLastBlockList || ( l && mLastBlockList && l->format().style() == mLastBlockList->format().style() ) ) )
631 const QTextListFormat listFormat = l->format();
632 if ( listFormat.style() == QTextListFormat::ListDisc )
634 mActionBulletList->setChecked(
true );
635 mActionOrderedList->setChecked(
false );
637 else if ( listFormat.style() == QTextListFormat::ListDecimal )
639 mActionBulletList->setChecked(
false );
640 mActionOrderedList->setChecked(
true );
644 mActionBulletList->setChecked(
false );
645 mActionOrderedList->setChecked(
false );
650 mActionBulletList->setChecked(
false );
651 mActionOrderedList->setChecked(
false );
655void QgsRichTextEditor::fontChanged(
const QFont &f )
657 mFontSizeCombo->setCurrentIndex( mFontSizeCombo->findData( f.pointSize() ) );
658 mActionBold->setChecked( f.bold() );
659 mActionItalic->setChecked( f.italic() );
660 mActionUnderline->setChecked( f.underline() );
661 mActionStrikeOut->setChecked( f.strikeOut() );
662 if ( f.bold() && f.pointSize() == mFontSizeH1 )
664 mParagraphStyleCombo->setCurrentIndex( ParagraphHeading1 );
666 else if ( f.bold() && f.pointSize() == mFontSizeH2 )
668 mParagraphStyleCombo->setCurrentIndex( ParagraphHeading2 );
670 else if ( f.bold() && f.pointSize() == mFontSizeH3 )
672 mParagraphStyleCombo->setCurrentIndex( ParagraphHeading3 );
674 else if ( f.bold() && f.pointSize() == mFontSizeH4 )
676 mParagraphStyleCombo->setCurrentIndex( ParagraphHeading4 );
680 if ( f.fixedPitch() && f.family() == mMonospaceFontFamily )
682 mParagraphStyleCombo->setCurrentIndex( ParagraphMonospace );
686 mParagraphStyleCombo->setCurrentIndex( ParagraphStandard );
689 if ( mTextEdit->textCursor().currentList() )
691 const QTextListFormat listFormat = mTextEdit->textCursor().currentList()->format();
692 if ( listFormat.style() == QTextListFormat::ListDisc )
694 mActionBulletList->setChecked(
true );
695 mActionOrderedList->setChecked(
false );
697 else if ( listFormat.style() == QTextListFormat::ListDecimal )
699 mActionBulletList->setChecked(
false );
700 mActionOrderedList->setChecked(
true );
704 mActionBulletList->setChecked(
false );
705 mActionOrderedList->setChecked(
false );
710 mActionBulletList->setChecked(
false );
711 mActionOrderedList->setChecked(
false );
715void QgsRichTextEditor::fgColorChanged(
const QColor &
c )
720void QgsRichTextEditor::bgColorChanged(
const QColor &
c )
728void QgsRichTextEditor::slotCurrentCharFormatChanged(
const QTextCharFormat &format )
730 fontChanged( format.font() );
731 bgColorChanged( ( format.background().isOpaque() ) ? format.background().color() : QColor() );
732 fgColorChanged( ( format.foreground().isOpaque() ) ? format.foreground().color() : palette().windowText().color() );
733 mActionInsertLink->setChecked( format.isAnchor() );
736void QgsRichTextEditor::slotClipboardDataChanged()
738#ifndef QT_NO_CLIPBOARD
739 if (
const QMimeData *md = QApplication::clipboard()->mimeData() )
740 mActionPaste->setEnabled( md->hasText() );
744void QgsRichTextEditor::increaseIndentation()
749void QgsRichTextEditor::decreaseIndentation()
754void QgsRichTextEditor::indent(
int delta )
756 QTextCursor cursor = mTextEdit->textCursor();
757 cursor.beginEditBlock();
758 QTextBlockFormat format = cursor.blockFormat();
759 const int indent = format.indent();
760 if ( indent + delta >= 0 )
762 format.setIndent( indent + delta );
764 cursor.setBlockFormat( format );
765 cursor.endEditBlock();
770 if ( text.isEmpty() )
772 mTextEdit->setPlainText( text );
773 mSourceEdit->clear();
777 const thread_local QRegularExpression sIsHtmlRx( u
"^\\s*<"_s );
778 if ( sIsHtmlRx.match( text ).hasMatch() )
780 mTextEdit->setHtml( text );
781 mSourceEdit->setText( text );
785 mTextEdit->setPlainText( text );
786 mSourceEdit->setText( text );
790void QgsRichTextEditor::insertImage()
793 const QString attdir = s.value( u
"general/filedialog-path"_s ).toString();
795 = QFileDialog::getOpenFileName(
this, tr(
"Select an image" ), attdir, tr(
"All images (*.jpg *.jpeg *.png *.bmp *.gif);;JPEG (*.jpg *.jpeg);;PNG (*.png);;BMP (*.bmp);;GIF (*.gif);;All files (*)" ) );
796 if ( file.isEmpty() )
799 QImageReader reader( file );
801 reader.setAutoTransform(
true );
802 const QImage image = reader.read();
804 mTextEdit->dropImage( image, QFileInfo( file ).suffix().toUpper().toLocal8Bit().data() );
807void QgsRichTextEditor::insertImageFromUrl()
810 const QString entered = QInputDialog::getText(
this, tr(
"Image from URL" ), tr(
"Enter the URL of an image:" ), QLineEdit::Normal, QString(), &ok );
811 if ( !ok || entered.trimmed().isEmpty() )
814 const QUrl url( entered.trimmed() );
815 if ( !url.isValid() || !( url.scheme().compare(
"http"_L1, Qt::CaseInsensitive ) == 0 || url.scheme().compare(
"https"_L1, Qt::CaseInsensitive ) == 0 ) )
817 QMessageBox::warning(
this, tr(
"Image from URL" ), tr(
"Please enter a valid http:// or https:// URL." ) );
821 QgsTemporaryCursorOverride busyCursor( Qt::WaitCursor );
823 QNetworkRequest request( url );
825 if ( content.
error() != QNetworkReply::NoError || content.
content().isEmpty() )
827 busyCursor.release();
828 QMessageBox::warning(
this, tr(
"Image from URL" ), tr(
"Failed to download the image: %1" ).arg( content.
errorString() ) );
832 QByteArray data = content.
content();
833 QBuffer buffer( &data );
834 buffer.open( QIODevice::ReadOnly );
837 reader.setAutoTransform(
true );
838 reader.setDevice( &buffer );
840 const QByteArray format = reader.format().isEmpty() ? QByteArray(
"PNG" ) : reader.format().toUpper();
841 const QImage image = reader.read();
842 busyCursor.release();
843 if ( image.isNull() )
845 QMessageBox::warning( this, tr(
"Image from URL" ), tr(
"The URL did not return an image." ) );
849 mTextEdit->dropImage( image, QString::fromLatin1( format ) );
@ MainWindowToolbar
Main window toolbar icons.
A HTML editor based on QScintilla2.
void setText(const QString &text) override
static QFont getMonospaceFont()
Returns the monospaced font to use for code editors.
static QSize iconSize(Qgis::UserInterfaceIconType iconType=Qgis::UserInterfaceIconType::MainWindowToolbar)
Returns the desired size for user interface icons.
static QgsNetworkReplyContent blockingGet(QNetworkRequest &request, const QString &authCfg=QString(), bool forceRefresh=false, QgsFeedback *feedback=nullptr, Qgis::NetworkRequestFlags flags=Qgis::NetworkRequestFlags())
Posts a GET request to obtain the contents of the target request and returns a new QgsNetworkReplyCon...
static QgsNetworkAccessManager * instance(Qt::ConnectionType connectionType=Qt::BlockingQueuedConnection)
Returns a pointer to the active QgsNetworkAccessManager for the current thread.
QString errorString() const
Returns the error text for the reply, or an empty string if no error was encountered.
QByteArray content() const
Returns the reply content.
QNetworkReply::NetworkError error() const
Returns the reply's error message, or QNetworkReply::NoError if no error was encountered.
QgsRichTextEditor(QWidget *parent=nullptr)
Constructor for QgsRichTextEditor, with the specified parent widget.
QString toPlainText() const
Returns the widget's content as a plain text string.
Mode mode() const
Returns the widget's mode, which defines which formatting options are exposed in the widget.
void setMode(Mode mode)
Sets the widget's mode, which defines which formatting options are exposed in the widget.
@ QTextDocument
Default mode, exposes the Qt supported HTML/CSS subset.
@ PlainText
Plain text mode.
QString toHtml() const
Returns the widget's content as a HTML string.
void textChanged()
Emitted when the text contents are changed.
void clearSource()
Clears the current text from the widget.
void focusInEvent(QFocusEvent *event) override
void setText(const QString &text)
Sets the text to show in the widget.
As part of the API refactoring and improvements which landed in the Processing API was substantially reworked from the x version This was done in order to allow much of the underlying Processing framework to be ported into c
QgsSignalBlocker< Object > whileBlocking(Object *object)
Temporarily blocks signals from a QObject while calling a single method from the object.