170void QFontDialogPrivate::init()
174 q->setSizeGripEnabled(
true);
175 q->setWindowTitle(QFontDialog::tr(
"Select Font"));
178 familyEdit =
new QLineEdit(q);
179 familyEdit->setReadOnly(
true);
180 familyList =
new QFontListView(q);
181 familyEdit->setFocusProxy(familyList);
183 familyAccel =
new QLabel(q);
184#ifndef QT_NO_SHORTCUT
185 familyAccel->setBuddy(familyList);
187 familyAccel->setIndent(2);
189 styleEdit =
new QLineEdit(q);
190 styleEdit->setReadOnly(
true);
191 styleList =
new QFontListView(q);
192 styleEdit->setFocusProxy(styleList);
194 styleAccel =
new QLabel(q);
195#ifndef QT_NO_SHORTCUT
196 styleAccel->setBuddy(styleList);
198 styleAccel->setIndent(2);
200 sizeEdit =
new QLineEdit(q);
201 sizeEdit->setFocusPolicy(Qt::ClickFocus);
202 QIntValidator *validator =
new QIntValidator(1, 512, q);
203 sizeEdit->setValidator(validator);
204 sizeList =
new QFontListView(q);
206 sizeAccel =
new QLabel(q);
207#ifndef QT_NO_SHORTCUT
208 sizeAccel->setBuddy(sizeList);
210 sizeAccel->setIndent(2);
213 effects =
new QGroupBox(q);
214 QVBoxLayout *vbox =
new QVBoxLayout(effects);
215 strikeout =
new QCheckBox(effects);
216 vbox->addWidget(strikeout);
217 underline =
new QCheckBox(effects);
218 vbox->addWidget(underline);
220 sample =
new QGroupBox(q);
221 QHBoxLayout *hbox =
new QHBoxLayout(sample);
222 sampleEdit =
new QLineEdit(sample);
223 sampleEdit->setSizePolicy(QSizePolicy(QSizePolicy::Ignored, QSizePolicy::Ignored));
224 sampleEdit->setAlignment(Qt::AlignCenter);
227 sampleEdit->setText(
"AaBbYyZz"_L1);
228 hbox->addWidget(sampleEdit);
230 writingSystemCombo =
new QComboBox(q);
232 writingSystemAccel =
new QLabel(q);
233#ifndef QT_NO_SHORTCUT
234 writingSystemAccel->setBuddy(writingSystemCombo);
236 writingSystemAccel->setIndent(2);
239 smoothScalable =
false;
241 QObjectPrivate::connect(writingSystemCombo, &QComboBox::activated,
242 this, &QFontDialogPrivate::writingSystemHighlighted);
243 QObjectPrivate::connect(familyList, &QFontListView::highlighted,
244 this, &QFontDialogPrivate::familyHighlighted);
245 QObjectPrivate::connect(styleList, &QFontListView::highlighted,
246 this, &QFontDialogPrivate::styleHighlighted);
247 QObjectPrivate::connect(sizeList, &QFontListView::highlighted,
248 this, &QFontDialogPrivate::sizeHighlighted);
249 QObjectPrivate::connect(sizeEdit, &QLineEdit::textChanged,
250 this, &QFontDialogPrivate::sizeChanged);
252 QObjectPrivate::connect(strikeout, &QCheckBox::clicked,
253 this, &QFontDialogPrivate::updateSample);
254 QObjectPrivate::connect(underline, &QCheckBox::clicked,
this,
255 &QFontDialogPrivate::updateSample);
257 for (
int i = 0; i < QFontDatabase::WritingSystemsCount; ++i) {
258 QFontDatabase::WritingSystem ws = QFontDatabase::WritingSystem(i);
259 QString writingSystemName = QFontDatabase::writingSystemName(ws);
260 if (writingSystemName.isEmpty())
262 writingSystemCombo->addItem(writingSystemName);
266 if (familyList->count() != 0) {
267 familyList->setCurrentItem(0);
268 sizeList->setCurrentItem(0);
272 QGridLayout *mainGrid =
new QGridLayout(q);
274 int spacing = mainGrid->spacing();
276 mainGrid->setSpacing(0);
278 mainGrid->setColumnMinimumWidth(1, spacing);
279 mainGrid->setColumnMinimumWidth(3, spacing);
282 mainGrid->getContentsMargins(
nullptr,
nullptr,
nullptr, &margin);
284 mainGrid->setRowMinimumHeight(3, margin);
285 mainGrid->setRowMinimumHeight(6, 2);
286 mainGrid->setRowMinimumHeight(8, margin);
289 mainGrid->addWidget(familyAccel, 0, 0);
290 mainGrid->addWidget(familyEdit, 1, 0);
291 mainGrid->addWidget(familyList, 2, 0);
293 mainGrid->addWidget(styleAccel, 0, 2);
294 mainGrid->addWidget(styleEdit, 1, 2);
295 mainGrid->addWidget(styleList, 2, 2);
297 mainGrid->addWidget(sizeAccel, 0, 4);
298 mainGrid->addWidget(sizeEdit, 1, 4);
299 mainGrid->addWidget(sizeList, 2, 4);
301 mainGrid->setColumnStretch(0, 38);
302 mainGrid->setColumnStretch(2, 24);
303 mainGrid->setColumnStretch(4, 10);
305 mainGrid->addWidget(effects, 4, 0);
307 mainGrid->addWidget(sample, 4, 2, 4, 3);
309 mainGrid->addWidget(writingSystemAccel, 5, 0);
310 mainGrid->addWidget(writingSystemCombo, 7, 0);
312 buttonBox =
new QDialogButtonBox(q);
313 mainGrid->addWidget(buttonBox, 9, 0, 1, 5);
316 =
static_cast<QPushButton *>(buttonBox->addButton(QDialogButtonBox::Ok));
317 QObject::connect(buttonBox, &QDialogButtonBox::accepted, q, &QDialog::accept);
318 button->setDefault(
true);
320 buttonBox->addButton(QDialogButtonBox::Cancel);
321 QObject::connect(buttonBox, &QDialogButtonBox::rejected, q, &QDialog::reject);
325 sizeEdit->installEventFilter(q);
326 familyList->installEventFilter(q);
327 styleList->installEventFilter(q);
328 sizeList->installEventFilter(q);
330 familyList->setFocus();
331 retranslateStrings();
332 sampleEdit->setObjectName(
"qt_fontDialog_sampleEdit"_L1);
418bool QFontDialog::eventFilter(QObject *o , QEvent *e)
421 if (e->type() == QEvent::KeyPress) {
422 QKeyEvent *k =
static_cast<QKeyEvent *>(e);
423 if (o == d->sizeEdit &&
424 (k->key() == Qt::Key_Up ||
425 k->key() == Qt::Key_Down ||
426 k->key() == Qt::Key_PageUp ||
427 k->key() == Qt::Key_PageDown)) {
429 int ci = d->sizeList->currentItem();
430 QCoreApplication::sendEvent(d->sizeList, k);
432 if (ci != d->sizeList->currentItem()
433 && style()->styleHint(QStyle::SH_FontDialog_SelectAssociatedText,
nullptr,
this))
434 d->sizeEdit->selectAll();
436 }
else if ((o == d->familyList || o == d->styleList) &&
437 (k->key() == Qt::Key_Return || k->key() == Qt::Key_Enter)) {
442 }
else if (e->type() == QEvent::FocusIn
443 && style()->styleHint(QStyle::SH_FontDialog_SelectAssociatedText,
nullptr,
this)) {
444 if (o == d->familyList)
445 d->familyEdit->selectAll();
446 else if (o == d->styleList)
447 d->styleEdit->selectAll();
448 else if (o == d->sizeList)
449 d->sizeEdit->selectAll();
450 }
else if (e->type() == QEvent::MouseButtonPress && o == d->sizeList) {
451 d->sizeEdit->setFocus();
453 return QDialog::eventFilter(o, e);
478void QFontDialogPrivate::updateFamilies()
482 enum match_t { MATCH_NONE = 0, MATCH_LAST_RESORT = 1, MATCH_APP = 2, MATCH_FAMILY = 3 };
484 const QFontDialog::FontDialogOptions scalableMask = (QFontDialog::ScalableFonts | QFontDialog::NonScalableFonts);
485 const QFontDialog::FontDialogOptions spacingMask = (QFontDialog::ProportionalFonts | QFontDialog::MonospacedFonts);
486 const QFontDialog::FontDialogOptions options = q->options();
488 QStringList familyNames;
489 const auto families = QFontDatabase::families(writingSystem);
490 for (
const QString &family : families) {
491 if (QFontDatabase::isPrivateFamily(family))
494 if ((options & scalableMask) && (options & scalableMask) != scalableMask) {
495 if (
bool(options & QFontDialog::ScalableFonts) != QFontDatabase::isSmoothlyScalable(family))
498 if ((options & spacingMask) && (options & spacingMask) != spacingMask) {
499 if (
bool(options & QFontDialog::MonospacedFonts) != QFontDatabase::isFixedPitch(family))
502 familyNames << family;
505 familyList->model()->setStringList(familyNames);
507 QString foundryName1, familyName1, foundryName2, familyName2;
508 int bestFamilyMatch = -1;
509 match_t bestFamilyType = MATCH_NONE;
514 QFontDatabasePrivate::parseFontName(family, foundryName1, familyName1);
516 QStringList::const_iterator it = familyNames.constBegin();
518 for(; it != familyNames.constEnd(); ++it, ++i) {
519 QFontDatabasePrivate::parseFontName(*it, foundryName2, familyName2);
522 if (familyName1 == familyName2) {
523 bestFamilyType = MATCH_FAMILY;
524 if (foundryName1 == foundryName2) {
528 if (bestFamilyMatch < MATCH_FAMILY)
533 match_t type = MATCH_NONE;
534 if (bestFamilyType <= MATCH_NONE && familyName2 ==
"helvetica"_L1)
535 type = MATCH_LAST_RESORT;
536 if (bestFamilyType <= MATCH_LAST_RESORT && familyName2 == f.family())
539 if (type != MATCH_NONE) {
540 bestFamilyType = type;
545 if (i != -1 && bestFamilyType != MATCH_NONE)
546 familyList->setCurrentItem(bestFamilyMatch);
548 familyList->setCurrentItem(0);
549 familyEdit->setText(familyList->currentText());
550 if (q->style()->styleHint(QStyle::SH_FontDialog_SelectAssociatedText,
nullptr, q)
551 && familyList->hasFocus())
552 familyEdit->selectAll();