DIY Qt Creatorの再蚭蚈





C ++ / Qtで開発しおいる人の倚くは、Qt Creatorのような環境に粟通しおいたす。QtCreatorの䜜成者は、機胜だけでなく蚭蚈にも取り組みたした。 しかし、私は暗い配色ずフラットなミニマリズムの愛奜者ずしお、パネルずグラデヌションヘッダヌの明るい背景が垞に奜きではありたせんでした。



それはオヌプン゜ヌスのように思えたす-それを取り、それを倉曎したすが、CSS圢匏でりィゞェットのタむプを蚘述するこずができるQt Style Sheetsのようなものを発芋するたで、経隓䞍足ず怠lazは私を止めたした。







事前に譊告したす。次の内容はあたり汚くないかもしれたせんが、 ハックです。 もちろん、圌はセキュリティホヌルを開いおパスワヌドを盗み、プラハのハッカヌに送信したすが、むンタヌフェヌスにはさたざたなアヌティファクトが存圚したす。



環境の準備



UPD䞍適切なパッチを適甚する代わりに、 サむバヌボブのアドバむスに埓っお、-stylesheet = stylesheet.cssパラメヌタヌを指定しおQtCreatorを実行するだけで十分なので、すぐに再描画に進みたす。



続けお
たず、環境の゜ヌスコヌドを取埗したす。 展開し、コンストラクタヌ./src/plugins/coreplugin/mainwindow.cpp:199



MainWindow::MainWindow()



./src/plugins/coreplugin/mainwindow.cpp:199



MainWindow::MainWindow()



に远加したす。これは、おおよそ./src/plugins/coreplugin/mainwindow.cpp:199



にあり、識別マヌクが付いおいるため、すぐに芋぀けお砎棄できたす。

 //$$MARKER //HACK: Injecting css to change appearance //       // Linux: /home/shed/.local/share/data/Nokia/QtCreator // Windows: C:\Document and Settings\user\Local Settings\Application Data QString csspath = QDesktopServices::storageLocation(QDesktopServices::DataLocation)+"/stylesheet.css"; QFile css(csspath); if (css.open(QIODevice::ReadOnly | QIODevice::Text)){ qDebug() << "NOTE: stylesheet loaded from" << csspath; QString style = QTextStream(&css).readAll(); qApp->setStyleSheet(style); } else { qDebug() << "NOTE: stylesheet not found in " << csspath; } //$$MARKEREND
      
      





怠け者は、最新の安定バヌゞョン2.5.0の倉曎されたファむルを取るこずができたす

それから

qmake && make && ./bin/qtcreator





すべおが順調に進んだ堎合、

NOTE: stylesheet not found in <--->/stylesheet.css







次に、このstylesheet.cssを䜜成し、怜蚌のためにそこに曞き蟌みたす

 background: blue; color: red;
      
      





qtcreatorを再起動したす神経を節玄するために、ワンクリックでqtcreatorを開始するように゚ディタヌを構成する必芁がありたす。



圓然のこずながら、setStyleはすべおを青で塗り぀ぶしたしたが、珟圚のドキュメントのクラスずメ゜ッドのリストず出力パネルのスむッチずいう2぀の反乱が珟れたした。 その理由は2぀ありたす。これらの芁玠はQWidgetの子孫ではなく、vryatliであるか、Qtスタむルシステムをバむパスしお独自のレンダリング方法を䜿甚したす。





再描画



ご存知のように、スタむルシヌトはフォヌムのレコヌドのセットです。

 <>[, <>, ...] { <>: <>; <>: <>; ... <>: <>; }
      
      





これたでにこのようなこずを曞いたこずがない堎合は、 チュヌトリアルのいく぀かのレッスンで、以䞋で䜕が起こるかを理解できたす。 Qtスタむルシヌトのドキュメントず䟋を埌で読む必芁がありたす。





セレクタヌ



デヌモン孊では、デヌモンを呌び出すには、その名前を知る必芁がありたす。この堎合、セレクタヌをコンパむルするには、クラス名、objectName、たたはQ_PROPERTYおよびsetPropertyを䜿甚しお指定されたプロパティの倀を知る必芁がありたす。

Qt はすべおのCSS2セレクタヌをサポヌトしたす。 ドキュメントによるず最も䟿利なもの





ナニバヌサルセレクタヌ * すべおのりィゞェットに䞀臎したす。
タむプセレクタヌ QPushButton QPushButtonクラスずそのサブクラスのむンスタンスに察応したす。
プロパティセレクタヌ QPushButton [flat = "false"] フラットではないQPushButtonクラスのむンスタンスに察応したす。 このセレクタを䜿甚しお、Q_PROPERTYを䜿甚しお指定されたQtプロパティを確認できたす。

=の代わりに〜=を䜿甚しお、QStringList型のQtプロパティに指定のQString文字列が含たれおいるかどうかを確認するこずもできたす。
クラスセレクタヌ .QPushButton QPushButtonクラスのむンスタンスに察応しおいたすが、そのサブクラスには察応しおいたせん。

匏* [class〜= "QPushButton"]ず同等です。

IDセレクタヌ QPushButtonokButton objectNameがokButtonであるQPushButtonクラスのすべおのむンスタンスに䞀臎したす。
子孫セレクタヌ QDialog QPushButton QDialogクラスの子孫子、孫などであるQPushButtonクラスのすべおのむンスタンスに䞀臎したす。
子セレクタヌ QDialog> QPushButton QDialogの盎接の子孫であるQPushButtonクラスのすべおのむンスタンスに䞀臎したす。


これたでのずころ、型セレクタヌにのみ関心があり、プロパティを䜿甚する方がより柔軟で適切ですが、これにはコヌドぞの介入が必芁です。





それでは、デザむナヌをプレむしたしょう。



思い出させおください、私たちはパネルに暗い背景を䜜りたかったのです。 これを行うには、セレクタヌを遞択する必芁がありたす。 これらのパネルには通垞䜕が衚瀺されたすか 「プロゞェクト」、「クラスの抂芁」、「タむプ階局」、「アりトラむン」女の子らしい「アりトラむン」のツリヌ、「ファむルシステム」、「ドキュメントを開く」、「ブックマヌク」のリスト、デバッグパネルのテヌブルなどe。 暙準のQListView、QTreeView、およびQTableVeiwの名前はQAbstractItemViewです。

したがっお、stylesheet.cssに以䞋を蚘述したす。

 QAbstractItemView { color: #EAEAEA; background: #232323; font-size: 9pt; }
      
      





たず、りィンドりサむズを最小に枛らしお、より倚くの芁玠が衚瀺されるようにしたす。



私たちは欲しいものを手に入れたしたが、愛されおいないにもかかわらずパネルは倖芳を倱い、チヌムもいたせんでした。 誰かがqApp->setStyle(new ManhattanStyle(baseName));



に沿っお目をqApp->setStyle(new ManhattanStyle(baseName));



、おそらく目立たない行qApp->setStyle(new ManhattanStyle(baseName));



特に氞続的な堎合、ManhattanStyleをクリックするず、QProxyStyleを継承しおいるこずに気付く可胜性がありたす。 パネルの描画を再定矩するのは圌です。 そしお、スタむルを蚭定するずすぐに舞台裏に出るのは圌です。

これらの色あせたボタンでたくさんのささいな矎しさの仕事を期埅しお、私はささいなこずをしないこずに決め、QAbstractItemViewに加えお、すべおのりィゞェットの父であるQMainWindowも芋たした。

 QAbstractItemView, QMainWindow { color: #EAEAEA; background: #232323; font-size: 9pt; }
      
      





以䞋を開始したす。



ほが必芁なもの。 タブ、ヘッダヌ、スクロヌルバヌの癜い点を隠すために残りたす。



サブ芁玠ず条件



CCS2ず同様に、Qtスタむルシヌトはサブ芁玠ず状態をサポヌトしおいたす。 フォヌム内のレコヌドセレクタヌ

 <>::<>:<>
      
      





たずえば、 QScrollBar::left-arrow:horizontal



は、氎平スクロヌルバヌのすべおの巊矢印を遞択したす。

ホワむトスポットでどのように機胜するかを芋おみたしょう。



QTreeViewおよびQAbstractItemViewの䜜成



開始するには、QAbstractItemViewで遞択した項目の倖芳を次のように暗いものに倉曎したす。

 QAbstractItemView::item:selected { color: #EAEAEA; background-color: #151515; }
      
      





比范する





それではQTreeViewを扱いたしょう。

その各行は、1぀のサブ芁玠::アむテムず1぀以䞊の::ブランチで構成されたす。



::暙準状態に加えおブランチはさらに4぀をサポヌトしたす

*青-目的の状態の芁玠

:open



:adjoins-item



:has-children



:has-subling





考えお、退屈な矢印を忘れお、グルヌプ化された芁玠の反察偎に小さな灰色の点を䜜るこずにしたした。 したがっお、必芁なのは:closed:adjoins-item:has-children



です。 次のようなパラメヌタヌを取埗したす

 QTreeView::branch:closed:adjoins-item:has-children { background: solid #777777; margin: 6px; height: 6px; width: 6px; border-radius: 3px; }
      
      









矢印が奜きなら、imageたたはborder-imageに枡されるurlファむル名コンストラクトが必芁です。これは、ハヌドドラむブたたはQtリ゜ヌスシステムに保存されおいる画像を背景たたは境界ずしお蚭定したす。



QScrollBarを倉曎する



Qtスタむルシヌトの目では、暙準のスクロヌルバヌは次のサブ芁玠で構成されおいたす。



皮肉なこずに、この3次元の玠晎らしさを鈍いグレヌグレヌの垯に倉え、ボタンを矢印ず䞀緒に送信しお、次の行で「䞍芁な2012」賞を授䞎したす。

 QScrollBar { border: none; background: #494949; height: 6px; width: 6px; margin: 0px; } QScrollBar::handle { background: #DBDBDB; min-width: 20px; min-height: 20px; } QScrollBar::add-line, QScrollBar::sub-line { background: none; border: none; } QScrollBar::add-page, QScrollBar::sub-page { background: none; }
      
      





取埗するもの







QTabBarを倉曎する



苊劎せずに、リビングルヌムのタブをやり盎したす。 ああ、開発者はこのりィゞェットをだたしたせんでした



ファンタゞヌの堎所がありたす。

芚えおおく必芁があるのは、QTabBarはQTabWidgetにあるため、りィゞェットを介しお背景を倉曎し、パネルを介しおタブのプロパティを倉曎する必芁がありたす。 しかし、私たちは気取らない人々であり、QMainWindowが背景の䞖話をしたので、现い目立たないタブを線でがかしたす

 QMainWindow, QAbstractItemView, QTreeView::branch, QTabBar::tab { ... QTabBar::tab:selected { font: bold; border-color: #9B9B9B; border-bottom-color: #C2C7CB; } QTabBar::tab:!selected { margin-top: 2px; }
      
      









QHeaderViewを倉曎する



知らなかった人のために、QtのこれらのテヌブルヘッダヌはすべおQHeaderViewです。 QTabBar ::タブず同じ状態を持぀1぀のサブ芁玠::セクションがありたす。



今回は、䌝統から離れおグラデヌションを塗り぀ぶすこずにしたしたはい、ここで可胜です。 これを行うには、構造qlineargradient、qradialgradient、qconicalgradientを䜿甚したす。 グラデヌションはオブゞェクト境界モヌドで指定されたす。 グラデヌションがレンダリングされ、その巊䞊隅が0、0にあり、右䞋隅が1、1にある長方圢を想像しおください。 この堎合の募配パラメヌタヌは、0〜1の小数ずしお瀺されたす。これらの倀は、実行時に長方圢の実際の座暙に倖挿されたす。 境界ボックスの倖偎にある倀を指定するこずができたすたずえば、-0.6たたは1.8。

次のデザむンを䜿甚したした。

 QHeaderView::section { background-color: qlineargradient(x1:0, y1:0, x2:0, y2:1, stop:0 #616161, stop: 0.5 #505050, stop: 0.6 #434343, stop:1 #656565); color: white; padding-left: 4px; border: 1px solid #6c6c6c; }
      
      







それが私たちが求めたものです。



頑固な゜ケットを説埗する



小さな問題が1぀だけありたす。



この分裂は、私たちの努力に完党に無関心であり、さらに、QWidgetのgreat祖父をセレクタヌずしお瀺した堎合でも、圌は無関心のたたでした。 それにもかかわらず、私はたださたざたなセレクタヌを詊したした。 初めお、QComboBoxずQLabelを䜿甚したセレクタヌでそれを貫通するこずができたした。

 QComboBox, QComboBox::drop-down { color: #EAEAEA; background: #232323; font-size: 9pt; border: none; padding: 1px 18px 1px 3px; min-width: 6em; } QLabel { border-style: solid; color: #EAEAEA; background: #232323; font-size: 9pt; }
      
      









顔の短所。 分割の呚りの少し容赊ない境界線スタむルのフレヌム、したがっお重い遺䌝もどこでも䞍適切に挏れたした。



ここで、偶然、垞識の䜎䞋が珟れたした。 子どもたち、りィンドりの䞊郚にあるボタンが䞀列に䞊んでいるのに、䜕がそんなに薄いのでしょうか もちろん、これはQToolBarです

私達は詊みたす

 QToolBar { border-style: solid; border-style: outset; color: #EAEAEA; background: #333333; font-size: 9pt; }
      
      









ビンゎ 深刻な病気の痕跡はすべお消え、反逆者は玠盎に䞀般的な芋解に加わりたした。





たずめ





stylesheet.css



TODO



色を゚ンコヌドするのではなく、パレットから取埗する方が正確です。パレットからは、゚ディタのカラヌスキヌムに応じお塗り぀ぶすこずができたす。 さらに、これらすべおを正しい远加の圢匏で配眮し、スタむルを遞択しお独自の蚭定ペヌゞを远加し、堎合によっおぱディタヌを远加するこずもできたす。 たあ、最も望たしいのはもちろん、快適であるが厚いサむドパネルで䜓重を枛らすこずです。 テキストを削陀し、CSSファむルからそのデザむンにアクセスしたすが、これにはコヌドぞのより深い介入が必芁であり、䞀般に、たったく異なるストヌリヌが必芁です。



All Articles