Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
Text Layout with Qt
Search
Jiang Jiang
December 12, 2011
Technology
2
170
Text Layout with Qt
A talk presented in Chinese about the text layout support in Qt framework.
Jiang Jiang
December 12, 2011
Tweet
Share
More Decks by Jiang Jiang
See All by Jiang Jiang
Vertical Text Layout For Qt
jjgod
1
1k
Other Decks in Technology
See All in Technology
JAWS DAYS 2026 楽しく学ぼう!ストレージ 入門
yoshiki0705
2
190
Tebiki Engineering Team Deck
tebiki
0
27k
今のWordPress の制作手法ってなにがあんねん?(改) / What’s the Deal with WordPress Development These Days?
tbshiki
0
460
Postman v12 で変わる API開発ワークフロー (Postman v12 アップデート) / New API development workflow with Postman v12
yokawasa
0
130
AIエージェント、 社内展開の前に知っておきたいこと
oracle4engineer
PRO
2
140
20260311 ビジネスSWG活動報告(デジタルアイデンティティ人材育成推進WG Ph2 活動報告会)
oidfj
0
340
AWSの資格って役に立つの?
tk3fftk
2
340
2026年もソフトウェアサプライチェーンのリスクに立ち向かうために / Product Security Square #3
flatt_security
1
490
身体を持ったパーソナルAIエージェントの 可能性を探る開発
yokomachi
1
120
It’s “Time” to use Temporal
sajikix
2
160
20260311 技術SWG活動報告(デジタルアイデンティティ人材育成推進WG Ph2 活動報告会)
oidfj
0
360
ガバメントクラウドにおけるAWSの長期継続割引について
takeda_h
2
280
Featured
See All Featured
B2B Lead Gen: Tactics, Traps & Triumph
marketingsoph
0
76
Impact Scores and Hybrid Strategies: The future of link building
tamaranovitovic
0
230
世界の人気アプリ100個を分析して見えたペイウォール設計の心得
akihiro_kokubo
PRO
67
37k
How to Ace a Technical Interview
jacobian
281
24k
My Coaching Mixtape
mlcsv
0
73
Responsive Adventures: Dirty Tricks From The Dark Corners of Front-End
smashingmag
254
22k
Redefining SEO in the New Era of Traffic Generation
szymonslowik
1
240
Winning Ecommerce Organic Search in an AI Era - #searchnstuff2025
aleyda
1
1.9k
How GitHub (no longer) Works
holman
316
140k
Everyday Curiosity
cassininazir
0
160
The agentic SEO stack - context over prompts
schlessera
0
700
Organizational Design Perspectives: An Ontology of Organizational Design Elements
kimpetersen
PRO
1
640
Transcript
5FYU3FOEFSJOHXJUI2U 2U֥໓Чᛴಙඌ ࡾࡿ KJBOHKJBOH!OPLJBDPN
ܱႿ Ֆᇏ॓ჽ࠹ෘ෮иြၛުđᄝ/PLJB ύථ֥2Uྙቆ۽ቔਔ၂୍϶Ġ ༟ߋ࣮۲ᇕ໓Чᛴಙඌđູ2U षؿؓႋۿିĠ ಣιႪ֥ሳุބஆϱĠι॓ߘཬ ඪaҕაषჷཛଢb • •
•
ݺ2U
ᄸહႨ2UϜᛴಙ֞ଞഈĤ
QLabel QLabel
QTextEdit/QLineEdit QTextEdit/QLineEdit
2.-5FYU&MFNFOU
TextEdit/TextInput
)5.-JO28FC7JFX
QPainter::drawText QPainter::drawText
ߎႵ۷ਲࠃི֥ۚٚمગĤ
߶ਔࢳ֞હĤ Ֆ໓Чࢳ༅֞ཁൕཞ֥ಆݖӱ 2U૫෮Ⴕཁൕ໓Ч֥ٚمđૌ֥Ⴊׄ ಌׄđൡႨٓຶ 2Uᄝ۲۱༯൞ᄸဢൌགྷؓႋۿି֥ • • •
E4BDA0E5A5BD5174 E4BDA0E5A5BD5174
E4BDA0 E5A5BD 51 74 E4BDA0 E5A5BD 51 74
65' U+4F60 U+597D U+0051 U+0074 U+4F60 U+597D U+0051 U+0074
ݺ2U 6 ' 6 % 6 6
QString::fromUtf8(" QString::fromUtf8("Qt") Qt")
ఃщĤ QTextCodec *codec = QTextCodec::codecForName("GB18030-0"); QString str = codec->toUnicode("...");
ଽ҆ൌགྷཬᆩ് 24USJOHଽ҆Ⴈ65'-&Ќթሳژ Աđؓႋ2$IBS֥ਙđૄ۱2$IBS൞ ၂۱65'-&սׄ ᄝ6OJDPEF#.1ၛຓ֥ նਈܞࠡᇏ֥ ݱሳ Ⴈਆ۱৵࿃֥2$IBSіൕ ބ8JOEPXT.BD049֩ӈ༢֥ჰ
ള"1*၂ᇁđॖၛᆰࢤሇߐ • • •
໓Чᛴಙ֥ݖӱ ሳژіղ ሳุྐ༏ ሳุ ሳྙა໊ ᇂྐ༏ ஆϱႄౣ ሳุࢳ༅ ሳุ९
ܻᅅ߄
ሳุ
Arial Times Verdana Nokia Pure Text
Nokia Sans
ሳุ९
ሳุ९֥թԥ໊ᇂ 4ZTUFN-JCSBSZ'POUT -JCSBSZ'POUT _-JCSBSZ'POUT $=8JOEPXT='POUT VTSTIBSFGPOUT _GPOUT
ೂޅ๙ݖӱ٠໙ሳุ९Ĥ
ჰള֥ሳุܵ &OVN'POU'BNJMJFT %8SJUF'POU$PMMFDUJPO "QQMF5ZQF4FSWJDFT $5'POU$PMMFDUJPO.BOBHFS GPOUDPOGJH
ॴሳุܵ 2'POU 2'POU%BUBCBTF
࿊ᄴ၂۱ሳุ QFont f("Helvetica"); f.setWeight(QFont::Bold); f.setStyle(QFont::StyleOblique); Helvetica Bold Oblique
ਙԛॖ࿊ሳุ QFontDatabase db; QStringList families = db.families(); for (int
i; i < families.size(); i++) qDebug() << families[i] << db.styles(families[i]); Arial (Bold, Regular, Oblique, Bold Oblique) Heiti SC (Light, Medium) ...
໓Чᛴಙ֥ݖӱ ሳژіղ ሳุྐ༏ ሳุ ሳྙა໊ ᇂྐ༏ ஆϱႄౣ ሳุࢳ༅ ሳุ९
ܻᅅ߄
ሳุ֥ࢳ༅
$."1
$."1 ሳژ DIBSBDUFS ሳྙ෬ႄ HMZQI 6 ' 6
% 6 6
ሳྙক
ଽ҆ൌགྷཬᆩ് .BD 9 8JOEPXT ሳุ९ "54 $PSF5FYU GPOUDPOGJH
(%* %JSFDU8SJUF ሳุᄛೆ $PSF5FYU 'SFF5ZQF
໊ᇂ࠹ෘ
ሳए GPOUNFUSJDT
HMZQINFUSJDT QFontMetrics:: boundingRect(ch)
2'POU.FUSJDT QFont f("STHeiti"); QFontMetrics m(f); QString str = QString::fromUtf8("Qt");
m.boundingRect(str); m.height(); m.ascent(); m.descent(); ... ၂ࠆ౼ ሳएྐ༏ ֥ٚൔ
ݺ2U֥एྐ༏ ሳژ ሳྙ෬ႄ BEWBODF QY ჰ໊ׄᇂ ࡌഡ ູఏׄ
ݺ 2 U
໓Чᛴಙ֥ݖӱ ሳژіղ ሳุྐ༏ ሳุ ሳྙა໊ ᇂྐ༏ ஆϱႄౣ ሳุࢳ༅ ሳุ९
ܻᅅ߄
҃अ࠹ෘߎླေॉ੮
ࡗएטᆜ LFSOJOH ৵ሳ MJHBUVSF ูߐሳྙ
ൗࢸ۲ֹ֥ཿ༢
2UႨ֥ॴஆϱႄౣ )BSG#V[[ ऎุൌགྷ༥ࢫ൞ؓ2Uӱჴૼ֥
ࡼሳྙকሇߐູཞ SBTUFSJ[BUJPO ܻᅅ߄
ᛴಙิൕ IJOUJOH ҂Ⴈ WFSUJDBM IJOUJOH
QFont::setHintingPreference PreferDefaultHinting PreferNoHinting PreferVerticalHinting PreferFullHinting
ᄝၛ༯ݖӱᇏປӮ QPainter::drawText {QLabel/QTextEdit/QLineEdit}::paint QPainter::drawStaticText QTextLayout::draw QPainter::drawGlyphRun • • •
• •
ଽ҆ൌགྷཬᆩ് 2Uᄝ҂༯ิ܂ჰള֥ሳุᛴಙğ 8JOEPXT༯Ⴈ(%*%JSFDU8SJUF .BD049༯Ⴈ$PSF(SBQIJDT 9༯Ⴈ'SFF5ZQF ؓႿնႿQY֥ሳุđႨ21BJOUFSᆰ ࢤᛴಙ൏ਈক 2U༯ᆦӻEJTUBODFGJFMEᛴಙ •
– – – • •
໓Чᛴಙ֥ݖӱཬࢲ ሳژіղ ሳุྐ༏ ሳุ ሳྙა໊ ᇂྐ༏ ஆϱႄౣ ሳุࢳ༅ ሳุ९
ܻᅅ߄
2Uሳุ༢ࡏܒ 'POU3FOEFSFS %JTUBODF'JFME /BUJWF '5 $( (%* %8 -BZPVU&OHJOF)BSG#V[[
1MBUGPSN'POU%BUBCBTF CBTJD GPOUDPOGJH DPSFUFYU XJOEPXT
۲༯֥2Uൌགྷཬࢲ .BD 9 8JOEPXT 21" ሳุ९ "54 $PSF5FYU GPOUDPOGJH
(%* %JSFDU8SJUF CBTJD GPOUDPOGJH DPSFUFYU ሳุᄛೆ $PSF5FYU 'SFF5ZQF 'SFF5ZQF $PSF5FYU ஆϱ $PSF5FYU )BSG#V[[ )BSG#V[[ ᛴಙ $PSF5FYU 'SFF5ZQF (%* %JSFDU8SJUF %JTUBODF 'JFME /BUJWF
Ⴈ2Uᇅ໓Ч֥۲ᇕٚൔ
2.-5FYUჭ Text { text: "Qt" font.family: "STHeiti" font.pointSize: 24
color: "red" }
໓Ч॥ࡱ 2-BCFM 2-JOF&EJU 25FYU&EJU
QTextEdit textEdit(str); textEdit.document()->setDefaultFont(f); textEdit.show(); QLineEdit lineEdit(str); lineEdit.setFont(f); lineEdit.show(); QString
str = QString::fromUtf8("Qt"); QFont f("STHeiti"); QLabel label(str); label.setFont(f); label.show();
21BJOUFSESBX5FYU
ESBX5FYU֥ҕඔ ݺ2U ໓Чჰׄ ຓॿ ؓఊ
ૄՑေᇗྍ҃अđིੱ҂ۚ
class MyWidget: public QWidget { public: MyWidget(QWidget *parent =
0) : QWidget(parent) protected: void paintEvent(QPaintEvent *) { QPainter painter(this); painter.setFont(QFont("STHeiti")); painter.drawText(50, 50, QString::fromUtf8("Qt")); } };
24UBUJD5FYU 2U
ߏթ҃अྐ༏ၛิۚᇗ؇
҂ߏթᛴಙުཞၛࢫസଽթ
ྟିбࢠ _ _ _
24UBUJD5FYUൡކᄝଽթႵཋ֥ ഡСഈླေّگᇗ֥ࢸ૫ჭ
class MyWidget: public QWidget { public: MyWidget(QWidget *parent =
0) : QWidget(parent), m_staticText(QString::fromUtf8("Qt")) protected: void paintEvent(QPaintEvent *) { QPainter painter(this); painter.setFont(QFont("STHeiti")); painter.drawStaticText(50, 50, m_staticText); } private: QStaticText m_staticText; };
25FYU-BZPVU
ӈ֥໓Чஆϱଆൔ
ֆণ
؟ণ
໓Чߌಡ
҂ܿᄵྙሑ
25FYU-BZPVUᄍྸ॥ᇅૄྛ ໓Ч໊֥ᇂaэߐ࢘؇აྙሑ
QFont f("STHeiti"); QFontMetrics fontMetrics(f); QTextLayout textLayout(QString::fromUtf8("Qt"), f); int leading
= fontMetrics.leading(); qreal height = 0; textLayout.beginLayout(); while (1) { QTextLine line = textLayout.createLine(); if (!line.isValid()) break; line.setLineWidth(lineWidth); height += leading; line.setPosition(QPointF(0, height)); height += line.height(); } textLayout.endLayout(); QPainter p(this); textLayout.draw(&p, QPointF(50, 50));
ቋָҪğ23BX'POU 2(MZQI3VO
2'POUWT23BX'POU
2'POUሳุ࿊ᄴ౨֥ࠢކ
2'POU Ⴈğ ေ7FSEBOBሳุቂ ေุོ ေՙุ ༢ğ ቋᆃ۱౨֥ሳุ൞ "/Library/Fonts/Verdana Bold
Italic.ttf" • – – – • –
23BX'POU࿊ק֥ൌ࠽ሳุ
2(MZQI3VO ၂۱23BX'POU ؟ؓ ሳྙ෬ႄ ໊ᇂ
ႨႿླေᆰࢤߏթᇅሳྙൈğ 2U8FC,JUބ2.-4DFOF(SBQI
QFont f("Nokia Pure Text"); QFontMetrics fontMetrics(f); QTextLayout textLayout(QString::fromUtf8("Qt"), f);
... textLayout.endLayout(); // QGlyphRun QList<QGlyphRun> glyphRuns = textLayout.glyphRuns(); QPainter p(this); // STHeiti "" p.drawGlyphRun(QPointF(50, 50), glyphRuns[0]); // Nokia Pure Text "Qt" p.drawGlyphRun(QPointF(50, 50), glyphRuns[1]);
ીႵ௴ൡ֥໓ЧᛴಙٚمĆ
۴ऌႋႨླ࿊ᄴކൡ֥ٚم ߋ႒࿃ิ໙
ҕॉ໓֖ 4UBUFPG5FYU3FOEFSJOHCZ#FIEBE&TGBICPE IUUQCFIEBEPSHUFYU ໓Чᛴಙඌ֥၂Ց؋੪ྛCZ+JBOH+JBOH IUUQKKHPEPSHEPDTTMJEFTUFYUSFOEFSJOHUFDIQEG %JTUBODF'JFMEሳุᛴಙඌࢺകCZ:PBOO-PQFT IUUQMBCTRUOPLJBDPNUFYUSFOEFSJOHJOUIF RNMTDFOFHSBQI 23BX'POUა2(MZQI3VOࢺകCZ&TLJM"CSBIBNTFO#MPNGFMEU IUUQMBCTRUOPLJBDPNIJOUIJOUOVEHFOVEHF
TBZOPNPSF 24UBUJD5FYUࢺകCZ&TLJM"CSBIBNTFO IUUQMBCTRUOPLJBDPNJOTBOJUZJTTIBQJOHUIF TBNFUFYUBHBJOBOEFYQFDUJOHBEJGGFSFOUSFTVMU • • • • •
໙ีĤ