Qt初心者が穴を踏む旅

3653 ワード

  • QtCreatorはClangCodeModelプラグインを有効にし、コードを分析し、警告します.これは良い機能で、潜在的な問題を発見することができますが、代価もあります.私の古いプロジェクトのように、ログモジュールは単一のヘッダファイルなので、大量の場所で使用されています.このログモジュールは大量の下線命名、vc内蔵拡張関数などを使用しているため、このモジュールは大量の警告を与えられています.また、大量のファイルに含まれて使用されているため、あちこちに警告があり、速度に深刻な影響を及ぼしています.よく半日かかります.仕方なくプラグイン管理でこのプラグインを無効にするしかありません.
  • QLabelでテキストを表示する場合、デフォルトではテキストの幅を最小サイズにして縮小する場合、幅を小さくすることはできません.
  • contextMenuEventのようなイベントが与えるパラメータでは,座標に触れると,この虚関数を上書きしたQWidgetオブジェクトに対して,この座標をサブオブジェクトに渡す際には注意が必要である.
  • QTable WidgetのclosePersistentEditorメソッド呼び出し時に、現在編集されているitemが選択されていない場合、このメソッドでitemSelectionChanged信号(removeItem、removeRowこれらのメソッドが現在選択されているitemまたはrowを削除するとitemSelectionChanged信号もトリガーされます)
  • はQWidget実装のサブクラスを継承し、setStyleSheetを使用して自分(QWidget)にスタイルを設定する場合は、次のようにpaintEventを上書きする必要があります.そうしないと、スタイルは自分に無効です.
    void CustomWidget::paintEvent(QPaintEvent *)
    {
        QStyleOption opt;
        opt.init(this);
        QPainter p(this);
        style()->drawPrimitive(QStyle::PE_Widget, &opt, &p, this);
    }
    
  • disconnect()またはdisconnect(this)は、オブジェクトの独自のメソッドスロットを切断するだけで、対応するlambdaスロットは無効な
  • です.
  • 分割線はQFrameを用いて実現することができ、一般的には3ステップである.
  • setFrameShape設定方向、QFrame::HLineは横分割線、QFrame::VLineは縦分割線;
  • setFixedHeight/setFixedWidth高さまたは幅を設定します.
  • QSSにより線の色を設定し、横分割線:QFrame[frameShape="4"]{color:black;}縦分割線:QFrame[frameShape=“5”{color:black;}

  • QWidgetのsetContentMarginsは、図としての領域を設定するために使用することができ、layoutのsetContentMarginsは重複せず、互いに独立している.QWidgetのsetContentMarginsは、一般にQWidget自体の枠線
  • を避けるために使用される.
  • QStackedLayoutのsetContentMarginsは無効(原因不明)で、
  • の代わりにQStackedWidgetを使用できます.
  • QWidget作成時にparentを指定しないとウィンドウになります.そうしないとサブコントロールになります.ここでは、作成時にparentを指定しない場合、直接または間接的にparentを設定しても、表示時にウィンドウが点滅する場合があるので、QWidgetをサブコントロールとして使用する場合は、作成時にparentを指定することが望ましい.もう1つのケースは、QWidgetの派生クラスであるQPShButtonのように、作成時にparentを指定しないが、続いてsetVisible(true)の操作が行われると、ウィンドウがフラッシュされる場合もある.この場合、作成時にparentを指定するか、別のタイミングでsetVisible(true)の操作を行います.
  • QSSでは、カスタムクラス名をタイプ選択子として使用することがサポートされています.metaObject()->className()で返されるクラス名を使用して一致します.ただし、クラス定義が名前空間にある場合、className()は、このグリッドがサブコントロール選択子と競合するため、匿名空間で定義されていないクラスに対して、選択子は--
  • に置き換えられます.
  • はQObjectのクラスを継承し、信号スロットを使わずに定義するときはQ_を持参するのが望ましい.OBJECTマクロは、このマクロがクラスのメタオブジェクトを定義するため、クラスの情報を取得することができる.このマクロを使用しない場合、metaObjectをコードで使用すると、親のクラス情報が取得され、混同される可能性があります.また、qssの選択子としてこのクラス名を使用すると、設定されたqssが無効であることがわかります.これは、選択子が一致すると、現在のクラスのクラス名が親のクラス名を返すため、
  • と一致しないためです.
  • QWidget派生クラスのあるイベントにのみ興味を持ち、簡単な処理を行う場合は、installEventFilterメソッドを使用してオブジェクトにイベントリスニングを加え、必要なイベントをフィルタリングして処理すればよいので、クラス定義の新しいクラスを再継承することを回避できます.
  • 一般的なQWidget派生クラスのフォーカスポリシーはいずれもQt::NoFocusであるため、空白領域をクリックしてフォーカスを切り替えることを実現するには、対応するQWidgetのフォーカスポリシーをQt::ClickFocus
  • に変更する必要がある.
  • QLineEditクリックして編集状態に入るプロセスで、まずFocusInEventを処理し、それからMousePressEventを処理し、MousePressEvent処理で選択をクリアし、入力子を適切な位置に置く.したがって、QLineEditがフォーカスを獲得した後にテキストを自動的に選択する効果を実現するには、FocusInventでselectAllを直接使用するのではなく、QTimer::singleShot(0, obj, &QLineEdit::selectAll)を非同期にしてこそ、後続のMousePressEventイベント処理によって
  • をクリアすることができます.
  • QSSのドキュメントでは、QWidget::setFontおよびQWidget::setPaletteは親コントロールから子コントロールに渡されますが、スタイルシートの設定はデフォルトでは行われません.ただし、setFontとスタイルシートには異なる転送システムがあり、スタイルシートが適用されるとfontは転送されません.デフォルトのフォントや色を設定する場合は、スタイルシートを統一して使用したほうがいいです.
  • QPShButtonがメニューを設定している場合、ボタンをクリックするときは、先にメニューが表示され、メニューが消えてからpressedとrelease信号が送信され、clicked信号は送信されません.
  • Qtライブラリの一部のコントロール右クリックメニューは英語のソリューションです.QLineEdit、QScrollBar、QSpinBoxなどのコントロールにはqt_をロードする必要があります.zh_CN.qm翻訳ファイル;QTextEdit、QplainTextEdit、QTextBrowserなどのコントロールにはwidgetsをロードする必要がある.qm翻訳ファイルは、Qtのインストールディレクトリにこのファイルが見つかりません.自分で生成する必要があります.