137void QFontDialogPrivate::init()
141 q->setSizeGripEnabled(
true);
142 q->setWindowTitle(QFontDialog::tr(
"Select Font"));
145 familyEdit =
new QLineEdit(q);
146 familyEdit->setReadOnly(
true);
147 familyList =
new QFontListView(q);
148 familyEdit->setFocusProxy(familyList);
150 familyAccel =
new QLabel(q);
151#ifndef QT_NO_SHORTCUT
152 familyAccel->setBuddy(familyList);
154 familyAccel->setIndent(2);
156 styleEdit =
new QLineEdit(q);
157 styleEdit->setReadOnly(
true);
158 styleList =
new QFontListView(q);
159 styleEdit->setFocusProxy(styleList);
161 styleAccel =
new QLabel(q);
162#ifndef QT_NO_SHORTCUT
163 styleAccel->setBuddy(styleList);
165 styleAccel->setIndent(2);
167 sizeEdit =
new QLineEdit(q);
168 sizeEdit->setFocusPolicy(Qt::ClickFocus);
169 QIntValidator *validator =
new QIntValidator(1, 512, q);
170 sizeEdit->setValidator(validator);
171 sizeList =
new QFontListView(q);
173 sizeAccel =
new QLabel(q);
174#ifndef QT_NO_SHORTCUT
175 sizeAccel->setBuddy(sizeEdit);
177 sizeAccel->setIndent(2);
180 effects =
new QGroupBox(q);
181 QVBoxLayout *vbox =
new QVBoxLayout(effects);
182 strikeout =
new QCheckBox(effects);
183 vbox->addWidget(strikeout);
184 underline =
new QCheckBox(effects);
185 vbox->addWidget(underline);
187 sample =
new QGroupBox(q);
188 QHBoxLayout *hbox =
new QHBoxLayout(sample);
189 sampleEdit =
new QLineEdit(sample);
190 sampleEdit->setSizePolicy(QSizePolicy(QSizePolicy::Ignored, QSizePolicy::Ignored));
191 sampleEdit->setAlignment(Qt::AlignCenter);
194 sampleEdit->setText(
"AaBbYyZz"_L1);
195 hbox->addWidget(sampleEdit);
197 writingSystemCombo =
new QComboBox(q);
199 writingSystemAccel =
new QLabel(q);
200#ifndef QT_NO_SHORTCUT
201 writingSystemAccel->setBuddy(writingSystemCombo);
203 writingSystemAccel->setIndent(2);
206 smoothScalable =
false;
208 QObjectPrivate::connect(writingSystemCombo, &QComboBox::activated,
209 this, &QFontDialogPrivate::writingSystemHighlighted);
210 QObjectPrivate::connect(familyList, &QFontListView::highlighted,
211 this, &QFontDialogPrivate::familyHighlighted);
212 QObjectPrivate::connect(styleList, &QFontListView::highlighted,
213 this, &QFontDialogPrivate::styleHighlighted);
214 QObjectPrivate::connect(sizeList, &QFontListView::highlighted,
215 this, &QFontDialogPrivate::sizeHighlighted);
216 QObjectPrivate::connect(sizeEdit, &QLineEdit::textChanged,
217 this, &QFontDialogPrivate::sizeChanged);
219 QObjectPrivate::connect(strikeout, &QCheckBox::clicked,
220 this, &QFontDialogPrivate::updateSample);
221 QObjectPrivate::connect(underline, &QCheckBox::clicked,
this,
222 &QFontDialogPrivate::updateSample);
224 for (
int i = 0; i < QFontDatabase::WritingSystemsCount; ++i) {
225 QFontDatabase::WritingSystem ws = QFontDatabase::WritingSystem(i);
226 QString writingSystemName = QFontDatabase::writingSystemName(ws);
227 if (writingSystemName.isEmpty())
229 writingSystemCombo->addItem(writingSystemName);
233 if (familyList->count() != 0) {
234 familyList->setCurrentItem(0);
235 sizeList->setCurrentItem(0);
239 QGridLayout *mainGrid =
new QGridLayout(q);
241 int spacing = mainGrid->spacing();
243 mainGrid->setSpacing(0);
245 mainGrid->setColumnMinimumWidth(1, spacing);
246 mainGrid->setColumnMinimumWidth(3, spacing);
249 mainGrid->getContentsMargins(
nullptr,
nullptr,
nullptr, &margin);
251 mainGrid->setRowMinimumHeight(3, margin);
252 mainGrid->setRowMinimumHeight(6, 2);
253 mainGrid->setRowMinimumHeight(8, margin);
256 mainGrid->addWidget(familyAccel, 0, 0);
257 mainGrid->addWidget(familyEdit, 1, 0);
258 mainGrid->addWidget(familyList, 2, 0);
260 mainGrid->addWidget(styleAccel, 0, 2);
261 mainGrid->addWidget(styleEdit, 1, 2);
262 mainGrid->addWidget(styleList, 2, 2);
264 mainGrid->addWidget(sizeAccel, 0, 4);
265 mainGrid->addWidget(sizeEdit, 1, 4);
266 mainGrid->addWidget(sizeList, 2, 4);
268 mainGrid->setColumnStretch(0, 38);
269 mainGrid->setColumnStretch(2, 24);
270 mainGrid->setColumnStretch(4, 10);
272 mainGrid->addWidget(effects, 4, 0);
274 mainGrid->addWidget(sample, 4, 2, 4, 3);
276 mainGrid->addWidget(writingSystemAccel, 5, 0);
277 mainGrid->addWidget(writingSystemCombo, 7, 0);
279 buttonBox =
new QDialogButtonBox(q);
280 mainGrid->addWidget(buttonBox, 9, 0, 1, 5);
283 =
static_cast<QPushButton *>(buttonBox->addButton(QDialogButtonBox::Ok));
284 QObject::connect(buttonBox, &QDialogButtonBox::accepted, q, &QDialog::accept);
285 button->setDefault(
true);
287 buttonBox->addButton(QDialogButtonBox::Cancel);
288 QObject::connect(buttonBox, &QDialogButtonBox::rejected, q, &QDialog::reject);
292 sizeEdit->installEventFilter(q);
293 familyList->installEventFilter(q);
294 styleList->installEventFilter(q);
295 sizeList->installEventFilter(q);
297 familyList->setFocus();
298 retranslateStrings();
299 sampleEdit->setObjectName(
"qt_fontDialog_sampleEdit"_L1);
385bool QFontDialog::eventFilter(QObject *o , QEvent *e)
388 if (e->type() == QEvent::KeyPress) {
389 QKeyEvent *k =
static_cast<QKeyEvent *>(e);
390 if (o == d->sizeEdit &&
391 (k->key() == Qt::Key_Up ||
392 k->key() == Qt::Key_Down ||
393 k->key() == Qt::Key_PageUp ||
394 k->key() == Qt::Key_PageDown)) {
396 int ci = d->sizeList->currentItem();
397 QCoreApplication::sendEvent(d->sizeList, k);
399 if (ci != d->sizeList->currentItem()
400 && style()->styleHint(QStyle::SH_FontDialog_SelectAssociatedText,
nullptr,
this))
401 d->sizeEdit->selectAll();
403 }
else if ((o == d->familyList || o == d->styleList) &&
404 (k->key() == Qt::Key_Return || k->key() == Qt::Key_Enter)) {
409 }
else if (e->type() == QEvent::FocusIn
410 && style()->styleHint(QStyle::SH_FontDialog_SelectAssociatedText,
nullptr,
this)) {
411 if (o == d->familyList)
412 d->familyEdit->selectAll();
413 else if (o == d->styleList)
414 d->styleEdit->selectAll();
415 else if (o == d->sizeList)
416 d->sizeEdit->selectAll();
417 }
else if (e->type() == QEvent::MouseButtonPress && o == d->sizeList) {
418 d->sizeEdit->setFocus();
420 return QDialog::eventFilter(o, e);
445void QFontDialogPrivate::updateFamilies()
449 enum match_t { MATCH_NONE = 0, MATCH_LAST_RESORT = 1, MATCH_APP = 2, MATCH_FAMILY = 3 };
451 const QFontDialog::FontDialogOptions scalableMask = (QFontDialog::ScalableFonts | QFontDialog::NonScalableFonts);
452 const QFontDialog::FontDialogOptions spacingMask = (QFontDialog::ProportionalFonts | QFontDialog::MonospacedFonts);
453 const QFontDialog::FontDialogOptions options = q->options();
455 QStringList familyNames;
456 const auto families = QFontDatabase::families(writingSystem);
457 for (
const QString &family : families) {
458 if (QFontDatabase::isPrivateFamily(family))
461 if ((options & scalableMask) && (options & scalableMask) != scalableMask) {
462 if (
bool(options & QFontDialog::ScalableFonts) != QFontDatabase::isSmoothlyScalable(family))
465 if ((options & spacingMask) && (options & spacingMask) != spacingMask) {
466 if (
bool(options & QFontDialog::MonospacedFonts) != QFontDatabase::isFixedPitch(family))
469 familyNames << family;
472 familyList->model()->setStringList(familyNames);
474 QString foundryName1, familyName1, foundryName2, familyName2;
475 int bestFamilyMatch = -1;
476 match_t bestFamilyType = MATCH_NONE;
481 QFontDatabasePrivate::parseFontName(family, foundryName1, familyName1);
483 QStringList::const_iterator it = familyNames.constBegin();
485 for(; it != familyNames.constEnd(); ++it, ++i) {
486 QFontDatabasePrivate::parseFontName(*it, foundryName2, familyName2);
489 if (familyName1 == familyName2) {
490 bestFamilyType = MATCH_FAMILY;
491 if (foundryName1 == foundryName2) {
495 if (bestFamilyMatch < MATCH_FAMILY)
500 match_t type = MATCH_NONE;
501 if (bestFamilyType <= MATCH_NONE && familyName2 ==
"helvetica"_L1)
502 type = MATCH_LAST_RESORT;
503 if (bestFamilyType <= MATCH_LAST_RESORT && familyName2 == f.families().constFirst())
506 if (type != MATCH_NONE) {
507 bestFamilyType = type;
512 if (i != -1 && bestFamilyType != MATCH_NONE)
513 familyList->setCurrentItem(bestFamilyMatch);
515 familyList->setCurrentItem(0);
516 familyEdit->setText(familyList->currentText());
517 if (q->style()->styleHint(QStyle::SH_FontDialog_SelectAssociatedText,
nullptr, q)
518 && familyList->hasFocus())
519 familyEdit->selectAll();