#include #include #include #include #include #include #include #include #include #include class TextWidget: public QWidget { Q_OBJECT public: TextWidget(QWidget *parent = 0): QWidget(parent), scale(1) { reset(new QTextDocument); doc->setDefaultFont(QFont("Calibri", 9)); doc->setPlainText("viele Expeditionen seit seiner GrĂ¼ndung"); } QTextDocument* document(void) { return doc.data(); } void reset(QTextDocument *d) { doc.reset(d); connect(d, &QTextDocument::contentsChanged, this, [this]() { update(); }); } void zoom(qreal z) { scale = z; doc->setTextWidth(width() / scale); update(); } virtual QSize sizeHint() const { return QSize(512, 128); } protected: virtual void paintEvent(QPaintEvent *ev) { QPainter painter(this); painter.scale(scale, scale); doc->drawContents(&painter, QRect(0, 0, width() / scale, height() / scale)); } virtual void resizeEvent(QResizeEvent *ev) { QWidget::resizeEvent(ev); if(ev) doc->setTextWidth(ev->size().width() / scale); } private: QScopedPointer doc; qreal scale; }; void findSizes(const QFont &font, QComboBox *sizeCombo) { QFontDatabase fontDatabase; QString currentSize = sizeCombo->currentText(); { const QSignalBlocker blocker(sizeCombo); // sizeCombo signals are now blocked until end of scope sizeCombo->clear(); int size; if (fontDatabase.isSmoothlyScalable(font.family(), fontDatabase.styleString(font))) { foreach (size, QFontDatabase::standardSizes()) { sizeCombo->addItem(QVariant(size).toString()); sizeCombo->setEditable(true); } } else { foreach (size, fontDatabase.smoothSizes(font.family(), fontDatabase.styleString(font))) { sizeCombo->addItem(QVariant(size).toString()); sizeCombo->setEditable(false); } } } int sizeIndex = sizeCombo->findText(currentSize); if(sizeIndex == -1) sizeCombo->setCurrentIndex(qMax(0, sizeCombo->count() / 3)); else sizeCombo->setCurrentIndex(sizeIndex); } int main(int argc, char *argv[]) { QApplication a(argc, argv); QFrame view; QGridLayout *pL; QSlider *pSl; QLabel *pLbl; QFontComboBox *pFontCombo; QComboBox *pSizeCombo; TextWidget *pTextWidget; view.setLayout(pL = new QGridLayout); pL->addWidget(pSl = new QSlider(Qt::Horizontal), 0, 0); pSl->setRange(1, 2048); pL->addWidget(pLbl = new QLabel, 0, 1); pL->addWidget(pFontCombo = new QFontComboBox, 0, 2); pL->addWidget(pSizeCombo = new QComboBox, 0, 3); pL->addWidget(pTextWidget = new TextWidget, 1, 0, 1, 4); QFont f = pTextWidget->document()->defaultFont(); pFontCombo->setCurrentFont(f); findSizes(f, pSizeCombo); pSizeCombo->setCurrentText(QString::number(f.pointSize())); QObject::connect(pFontCombo, &QFontComboBox::currentFontChanged, pTextWidget, [pTextWidget, pSizeCombo](const QFont &f) { findSizes(f, pSizeCombo); QTextCursor cursor(pTextWidget->document()); cursor.select(QTextCursor::Document); QTextCharFormat fmt = cursor.charFormat(); fmt.setFontFamily(f.family()); cursor.setCharFormat(fmt); }); QObject::connect(pSizeCombo, &QComboBox::currentTextChanged, pTextWidget, [pTextWidget](const QString &s) { QTextCursor cursor(pTextWidget->document()); cursor.select(QTextCursor::Document); QTextCharFormat fmt = cursor.charFormat(); bool ok = false; if(s.toDouble(&ok) > 0 && ok) { fmt.setFontPointSize(s.toDouble()); cursor.setCharFormat(fmt); } }); QObject::connect(pSl, &QSlider::valueChanged, pLbl, [pLbl, pTextWidget, &view](int val) { int dpix = view.logicalDpiX(); int dpiy = view.logicalDpiY(); pLbl->setText(QString("zoom: %1%; dpi: %2") .arg(val).arg((dpix + dpiy) / 2)); pTextWidget->zoom(val / 100.); }); pSl->setValue(300); view.show(); return a.exec(); } #include "main.moc"