2

システムテーマを切り替えると、アクティブなタブに対して、テキストに不要なアウトラインが含まれているテーマが見つかります。¿

そのアウトラインのスタイルを設定して非表示にする方法がわからないため、タブのテキストはこのようにきれいに見えます。

これは可能ですか?を使用してスタイルシートを試しましたがoutline: 0;、何も起こりません。

おそらくペイントイベントを再実装しますか?しかし、それを行うための正確なコードについてはわかりません。どんな助けでも大歓迎です。

4

1 に答える 1

1

私はqtソースをブラウズしていましたが、あなたが説明しているのはフォーカス長方形だと思います。タブバーにフォーカスがある場合にのみ表示されます (または、動作が異なりますか?)。ウィンドウをタブでスクロールすると、現在フォーカスされているウィジェットが表示されないため、それを削除するとユーザーが混乱する可能性があります。タブバーをまったくフォーカスしないようにすることは解決策かもしれませんが、ユーザーはキーボードでタブを変更できなくなります。

本当に削除したい場合は、QProxyStyle をサブクラス化し、drawPrimitive メソッドを再実装することをお勧めします。そのため、QStyle::PE_FrameFocusRect では何もせず、他の要素では QProxyStyle::drawPrimitive を呼び出します。

編集:

私はこのアプローチをテストしましたが、うまくいきませんでした。時間があれば、その理由を突き止めようとします。

EDIT2:

長い調査の結果、QStyle::PE_FrameFocusRect が機能しない理由がわかりました。プロキシ スタイルを完全にバイパスして、フォーカスの四角形がスタイルによって直接描画されているようです。再実装可能な最小のコードは CE_TabBarTabLabel 要素の drawPrimitve ですが、タブのラベルを自分でペイントする必要があり、マルチスタイル環境では実際に行うべきではないため、これは適していません。

CleanLooks スタイルのコードをさらに調べた後 (Ambiance について言及していないようです。または、ここでばかげた間違いを犯しているのでしょうか?) qt の設計者は、スタイルへのそのような外科的アプローチを許可していなかったと確信しています。フレーム、それを防ぐためにできることはほとんどありません。

パレットの色をいじってそのようなフレームを「ブレンド」することは、他のスタイルがそれらの値を異なる方法で解釈し、さらに見栄えを悪くする可能性があるため、ほとんど不可能です。Cleanlooks は、パレットのボタンの色から使用されるほとんどすべての色を駆動し、darker() または light() バージョンであるため、1 つのスタイルでも不可能です。

また、qt-stylesheet エンジンを使用してこのフレームを取り除くことができるかどうかを確認しようとしましたが、どのスタイルシートを使用しても、フレームは目立った変化なしに描画されました。int qt ソース コードをもう一度調べたところ、このフレームを描画するコードはスタイルシートを認識していないことがわかりました。

私が非常にうまく機能していることがわかった唯一のアプローチは、スタイルをごまかして、描画されたタブがまったくフォーカスされていないと考えさせることでした。私が思いついたコードは次のとおりです。

class myStyle: public QProxyStyle{
public:
    myStyle(QStyle* baseStyle)
        :QProxyStyle(baseStyle){}

    virtual void drawControl ( ControlElement element, const QStyleOption * option, QPainter * painter, const QWidget * widget = 0 ) const{

        if (element == CE_TabBarTabLabel){
            if (const QStyleOptionTab *tb = qstyleoption_cast<const QStyleOptionTab *>(option)) {
                if (tb->state & State_HasFocus){
                    QStyleOptionTab t(*tb);
                    t.state = t.state^State_HasFocus;
                    QProxyStyle::drawControl(element, &t, painter, widget);
                    return;
                }
            }
        }
        QProxyStyle::drawControl(element, option, painter, widget);
    }
};

このようなスタイルを tabBar() ウィジェットに設定すると、正しいスタイルが使用され、タブはフォーカス四角形なしで描画されます。tabBar() は保護されたメソッドなので、QTabWidget を継承するクラスを作成する必要があります。

このソリューションは機能しますが、きれいとは言えません。虚偽の情報を提供することによって、それは詐欺スタイルです。ウィジェットは通常どおり(フォーカスされていない)自分自身を描画しているだけなので、醜いアーティファクトにつながるとは思いません。ただし、ユーザーは通常、キーボード フォーカスが実際にどこにあるかを確認することを期待しているため (特に、他のすべてのアプリがタブにフォーカスを表示している場合)、混乱する可能性があります。私が選ぶとしたら、ルックスよりも一貫性を好むでしょう。

回答の最初の部分 (編集前) で書いたように、タブ ウィジェットで setFocusPolicy(Qt::NoFocus) を呼び出すこともできるため、フォーカスをまったく受け入れません。たとえば、推奨されることさえあります。タブがメイン ウィンドウにドッキングされたドック ウィジェットにある場合。

于 2011-10-10T13:45:15.707 に答える