//对字体的支持 QFont obs_data_get_qfont(obs_data_t *data, const char *name){ obs_data_t *font_obj = obs_data_get_obj(data, name); const char *face = obs_data_get_string(font_obj, "face"); const char *style = obs_data_get_string(font_obj, "style"); int size = (int)obs_data_get_int(font_obj, "size"); uint32_t flags = (uint32_t)obs_data_get_int(font_obj, "flags"); QFont font; if (face) { font.setFamily(face); font.setStyleName(style); } if (size) font.setPointSize(size); if (flags & OBS_FONT_BOLD) font.setBold(true); if (flags & OBS_FONT_ITALIC) font.setItalic(true); if (flags & OBS_FONT_UNDERLINE) font.setUnderline(true); if (flags & OBS_FONT_STRIKEOUT) font.setStrikeOut(true); return font; }
QFont stringToFont(const QString& font) { QFontDatabase fdb; QString fontFamily; int familyIdx=-1; QStringList allFamilies = fdb.families(); for(int idx=font.indexOf(' '); idx<font.size() && idx>=0; idx=font.indexOf(' ', idx+1)) { QString testFont = font.left(idx); if(allFamilies.contains(testFont)) { fontFamily = testFont; familyIdx = idx; } } QFont f; f.setFamily(fontFamily); QRegularExpression fontRx(QStringLiteral(" (.*) +([0-9]+)$")); QRegularExpressionMatch match = fontRx.match(font, familyIdx); if (match.isValid()) { QString fontStyle = match.captured(1).trimmed(); int fontSize = match.captured(2).toInt(); f.setStyleName(fontStyle); f.setPointSize(fontSize); } else { qWarning() << "Couldn't figure out syle and size" << font; } return f; }
QVariant XmlFontSerializator::loadValue() { QFont font; font.setFamily(node()->attribute("family")); font.setPointSize(node()->attribute("pointSize").toInt()); #if QT_VERSION>0x040800 font.setStyleName(node()->attribute("stylename")); #endif font.setWeight(node()->attribute("weight").toInt()); if (!node()->attribute("bold").isEmpty()) font.setBold(node()->attribute("bold").toInt()); font.setItalic(node()->attribute("italic").toInt()); font.setUnderline(node()->attribute("underline").toInt()); return font; }
void tst_QPicture::serialization() { QDataStream stream; const int thisVersion = stream.version(); for (int version = QDataStream::Qt_1_0; version <= thisVersion; ++version) { const QDataStream::Version versionEnum = static_cast<QDataStream::Version>(version); { // streaming of null pictures ensureSerializesCorrectly(QPicture(), versionEnum); } { // picture with a simple line, checking bitwise equality QPicture picture; QPainter painter(&picture); painter.drawLine(10, 20, 30, 40); ensureSerializesCorrectly(picture, versionEnum); } } { // Test features that were added after Qt 4.5, as that was hard-coded as the major // version for a while, which was incorrect. In this case, we'll test font hints. QPicture picture; QPainter painter; QFont font; font.setStyleName("Blah"); font.setHintingPreference(QFont::PreferFullHinting); painter.begin(&picture); painter.setFont(font); painter.drawText(20, 20, "Hello"); painter.end(); Picture customPicture; painter.begin(&customPicture); picture.play(&painter); const QFont actualFont = ((PaintEngine*)customPicture.paintEngine())->font(); painter.end(); QCOMPARE(actualFont.styleName(), QStringLiteral("Blah")); QCOMPARE(actualFont.hintingPreference(), QFont::PreferFullHinting); } }
SearchView::SearchView(QWidget *parent) : View(parent) { #if defined(APP_MAC) | defined(APP_WIN) // speedup painting since we'll paint the whole background // by ourselves anyway in paintEvent() setAttribute(Qt::WA_OpaquePaintEvent); #endif QBoxLayout *mainLayout = new QVBoxLayout(this); mainLayout->setMargin(PADDING); mainLayout->setSpacing(0); // hidden message widget message = new QLabel(this); message->hide(); mainLayout->addWidget(message); mainLayout->addStretch(); QBoxLayout *hLayout = new QHBoxLayout(); hLayout->setAlignment(Qt::AlignCenter); mainLayout->addLayout(hLayout); QLabel *logo = new QLabel(this); logo->setPixmap(IconUtils::pixmap(":/images/app.png")); hLayout->addWidget(logo, 0, Qt::AlignTop); hLayout->addSpacing(PADDING); QVBoxLayout *layout = new QVBoxLayout(); layout->setAlignment(Qt::AlignCenter); hLayout->addLayout(layout); QLabel *welcomeLabel = new QLabel("<h1 style='font-weight:100'>" + tr("Welcome to <a href='%1'>%2</a>,") .replace("<a ", "<a style='text-decoration:none; color:palette(text);font-weight:normal' ") .arg(Constants::WEBSITE, Constants::NAME) + "</h1>", this); welcomeLabel->setOpenExternalLinks(true); welcomeLabel->setProperty("heading", true); #ifdef APP_MAC QFont f = welcomeLabel->font(); f.setFamily("Helvetica Neue"); f.setStyleName("Thin"); welcomeLabel->setFont(f); #elif APP_WIN QFont f = welcomeLabel->font(); f.setFamily("Segoe UI Light"); welcomeLabel->setFont(f); #endif layout->addWidget(welcomeLabel); layout->addSpacing(PADDING / 2); QBoxLayout *tipLayout = new QHBoxLayout(); tipLayout->setSpacing(10); #ifndef APP_MAC const QFont &biggerFont = FontUtils::big(); #endif //: "Enter", as in "type". The whole phrase says: "Enter a keyword to start watching videos" QLabel *tipLabel = new QLabel(tr("Enter"), this); #ifndef APP_MAC tipLabel->setFont(biggerFont); #endif tipLayout->addWidget(tipLabel); typeCombo = new QComboBox(this); typeCombo->addItem(tr("a keyword")); typeCombo->addItem(tr("a channel")); #ifndef APP_MAC typeCombo->setFont(biggerFont); #endif connect(typeCombo, SIGNAL(currentIndexChanged(int)), SLOT(searchTypeChanged(int))); tipLayout->addWidget(typeCombo); tipLabel = new QLabel(tr("to start watching videos."), this); #ifndef APP_MAC tipLabel->setFont(biggerFont); #endif tipLayout->addWidget(tipLabel); layout->addLayout(tipLayout); layout->addSpacing(PADDING / 2); QHBoxLayout *searchLayout = new QHBoxLayout(); searchLayout->setAlignment(Qt::AlignVCenter); #ifdef APP_MAC_SEARCHFIELD queryEdit = new SearchLineEditMac(this); #else SearchLineEdit *sle = new SearchLineEdit(this); sle->setFont(biggerFont); queryEdit = sle; #endif connect(queryEdit->toWidget(), SIGNAL(search(const QString&)), SLOT(watch(const QString&))); connect(queryEdit->toWidget(), SIGNAL(textChanged(const QString &)), SLOT(textChanged(const QString &))); connect(queryEdit->toWidget(), SIGNAL(suggestionAccepted(Suggestion*)), SLOT(suggestionAccepted(Suggestion*))); youtubeSuggest = new YTSuggester(this); channelSuggest = new ChannelSuggest(this); searchTypeChanged(0); searchLayout->addWidget(queryEdit->toWidget()); searchLayout->addSpacing(10); watchButton = new QPushButton(tr("Watch"), this); #ifndef APP_MAC watchButton->setFont(biggerFont); #endif watchButton->setDefault(true); watchButton->setEnabled(false); watchButton->setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Fixed); connect(watchButton, SIGNAL(clicked()), this, SLOT(watch())); searchLayout->addWidget(watchButton); layout->addItem(searchLayout); layout->addSpacing(PADDING / 2); QHBoxLayout *otherLayout = new QHBoxLayout(); otherLayout->setMargin(0); otherLayout->setSpacing(10); recentKeywordsLayout = new QVBoxLayout(); recentKeywordsLayout->setSpacing(5); recentKeywordsLayout->setAlignment(Qt::AlignTop | Qt::AlignLeft); recentKeywordsLabel = new QLabel(tr("Recent keywords"), this); recentKeywordsLabel->setProperty("recentHeader", true); recentKeywordsLabel->hide(); recentKeywordsLayout->addWidget(recentKeywordsLabel); otherLayout->addLayout(recentKeywordsLayout); // recent channels recentChannelsLayout = new QVBoxLayout(); recentChannelsLayout->setSpacing(5); recentChannelsLayout->setAlignment(Qt::AlignTop | Qt::AlignLeft); recentChannelsLabel = new QLabel(tr("Recent channels"), this); recentChannelsLabel->setProperty("recentHeader", true); recentChannelsLabel->setForegroundRole(QPalette::Dark); recentChannelsLabel->hide(); recentChannelsLayout->addWidget(recentChannelsLabel); otherLayout->addLayout(recentChannelsLayout); layout->addLayout(otherLayout); mainLayout->addStretch(); #ifdef APP_ACTIVATION if (!Activation::instance().isActivated()) mainLayout->addWidget(Extra::buyButton(tr("Get the full version")), 0, Qt::AlignRight); #endif }
void tst_QFont::serialize_data() { QTest::addColumn<QFont>("font"); // The version in which the tested feature was added. QTest::addColumn<QDataStream::Version>("minimumStreamVersion"); QFont basicFont; // Versions <= Qt 2.1 had broken point size serialization, // so we set an integer point size. basicFont.setPointSize(9); // Versions <= Qt 5.4 didn't serialize styleName, so clear it basicFont.setStyleName(QString()); QFont font = basicFont; QTest::newRow("defaultConstructed") << font << QDataStream::Qt_1_0; font.setLetterSpacing(QFont::AbsoluteSpacing, 105); QTest::newRow("letterSpacing") << font << QDataStream::Qt_4_5; font = basicFont; font.setWordSpacing(50.0); QTest::newRow("wordSpacing") << font << QDataStream::Qt_4_5; font = basicFont; font.setPointSize(20); QTest::newRow("pointSize") << font << QDataStream::Qt_1_0; font = basicFont; font.setPixelSize(32); QTest::newRow("pixelSize") << font << QDataStream::Qt_3_0; font = basicFont; font.setStyleHint(QFont::Monospace); QTest::newRow("styleHint") << font << QDataStream::Qt_1_0; font = basicFont; font.setStretch(4000); QTest::newRow("stretch") << font << QDataStream::Qt_4_3; font = basicFont; font.setWeight(99); QTest::newRow("weight") << font << QDataStream::Qt_1_0; font = basicFont; font.setUnderline(true); QTest::newRow("underline") << font << QDataStream::Qt_1_0; font = basicFont; font.setStrikeOut(true); QTest::newRow("strikeOut") << font << QDataStream::Qt_1_0; font = basicFont; font.setFixedPitch(true); // This fails for versions less than this, as ignorePitch is set to false // whenever setFixedPitch() is called, but ignorePitch is considered an // extended bit, which were apparently not available until 4.4. QTest::newRow("fixedPitch") << font << QDataStream::Qt_4_4; font = basicFont; font.setLetterSpacing(QFont::AbsoluteSpacing, 10); // Fails for 4.4 because letterSpacing wasn't read until 4.5. QTest::newRow("letterSpacing") << font << QDataStream::Qt_4_5; font = basicFont; font.setKerning(false); QTest::newRow("kerning") << font << QDataStream::Qt_4_0; font = basicFont; font.setStyleStrategy(QFont::NoFontMerging); // This wasn't read properly until 5.4. QTest::newRow("styleStrategy") << font << QDataStream::Qt_5_4; font = basicFont; font.setHintingPreference(QFont::PreferFullHinting); // This wasn't read until 5.4. QTest::newRow("hintingPreference") << font << QDataStream::Qt_5_4; font = basicFont; font.setStyleName("Regular Black Condensed"); // This wasn't read until 5.4. QTest::newRow("styleName") << font << QDataStream::Qt_5_4; font = basicFont; font.setCapitalization(QFont::AllUppercase); // This wasn't read until 5.6. QTest::newRow("capitalization") << font << QDataStream::Qt_5_6; }
static QFont fontFromObject(QQmlV4Handle object, QV4::ExecutionEngine *v4, bool *ok) { if (ok) *ok = false; QFont retn; QV4::Scope scope(v4); QV4::ScopedObject obj(scope, object); if (!obj) { if (ok) *ok = false; return retn; } QV4::ScopedString s(scope); QV4::ScopedValue vbold(scope, obj->get((s = v4->newString(QStringLiteral("bold"))))); QV4::ScopedValue vcap(scope, obj->get((s = v4->newString(QStringLiteral("capitalization"))))); QV4::ScopedValue vfam(scope, obj->get((s = v4->newString(QStringLiteral("family"))))); QV4::ScopedValue vstyle(scope, obj->get((s = v4->newString(QStringLiteral("styleName"))))); QV4::ScopedValue vital(scope, obj->get((s = v4->newString(QStringLiteral("italic"))))); QV4::ScopedValue vlspac(scope, obj->get((s = v4->newString(QStringLiteral("letterSpacing"))))); QV4::ScopedValue vpixsz(scope, obj->get((s = v4->newString(QStringLiteral("pixelSize"))))); QV4::ScopedValue vpntsz(scope, obj->get((s = v4->newString(QStringLiteral("pointSize"))))); QV4::ScopedValue vstrk(scope, obj->get((s = v4->newString(QStringLiteral("strikeout"))))); QV4::ScopedValue vundl(scope, obj->get((s = v4->newString(QStringLiteral("underline"))))); QV4::ScopedValue vweight(scope, obj->get((s = v4->newString(QStringLiteral("weight"))))); QV4::ScopedValue vwspac(scope, obj->get((s = v4->newString(QStringLiteral("wordSpacing"))))); QV4::ScopedValue vhint(scope, obj->get((s = v4->newString(QStringLiteral("hintingPreference"))))); QV4::ScopedValue vkerning(scope, obj->get((s = v4->newString(QStringLiteral("kerning"))))); QV4::ScopedValue vshaping(scope, obj->get((s = v4->newString(QStringLiteral("preferShaping"))))); // pull out the values, set ok to true if at least one valid field is given. if (vbold->isBoolean()) { retn.setBold(vbold->booleanValue()); if (ok) *ok = true; } if (vcap->isInt32()) { retn.setCapitalization(static_cast<QFont::Capitalization>(vcap->integerValue())); if (ok) *ok = true; } if (vfam->isString()) { retn.setFamily(vfam->toQString()); if (ok) *ok = true; } if (vstyle->isString()) { retn.setStyleName(vstyle->toQString()); if (ok) *ok = true; } if (vital->isBoolean()) { retn.setItalic(vital->booleanValue()); if (ok) *ok = true; } if (vlspac->isNumber()) { retn.setLetterSpacing(QFont::AbsoluteSpacing, vlspac->asDouble()); if (ok) *ok = true; } if (vpixsz->isInt32()) { retn.setPixelSize(vpixsz->integerValue()); if (ok) *ok = true; } if (vpntsz->isNumber()) { retn.setPointSize(vpntsz->asDouble()); if (ok) *ok = true; } if (vstrk->isBoolean()) { retn.setStrikeOut(vstrk->booleanValue()); if (ok) *ok = true; } if (vundl->isBoolean()) { retn.setUnderline(vundl->booleanValue()); if (ok) *ok = true; } if (vweight->isInt32()) { retn.setWeight(static_cast<QFont::Weight>(vweight->integerValue())); if (ok) *ok = true; } if (vwspac->isNumber()) { retn.setWordSpacing(vwspac->asDouble()); if (ok) *ok = true; } if (vhint->isInt32()) { retn.setHintingPreference(static_cast<QFont::HintingPreference>(vhint->integerValue())); if (ok) *ok = true; } if (vkerning->isBoolean()) { retn.setKerning(vkerning->booleanValue()); if (ok) *ok = true; } if (vshaping->isBoolean()) { bool enable = vshaping->booleanValue(); if (enable) retn.setStyleStrategy(static_cast<QFont::StyleStrategy>(retn.styleStrategy() & ~QFont::PreferNoShaping)); else retn.setStyleStrategy(static_cast<QFont::StyleStrategy>(retn.styleStrategy() | QFont::PreferNoShaping)); } return retn; }