1

QComboBox と同様の動作を持つウィジェットを作成しようとしていますが、ユーザーが矢印をクリックするか、ウィジェットの他の場所をクリックするかによって動作が異なります。手始めに、ウィジェット自体を QToolButton が重ねられた幅の広い QPushButton としてモデル化しています。これを希望どおりに表示したら、QListView を追加してドロップダウン メニューを提供し、ユニットが QToolButton (QPushButton ではなく) を押すたびに表示されるようにします。これまでの私の基本的なテストコードは次のようになります。

#include <QtWidgets/QApplication>

#include <QDialog>
#include <QPushButton>
#include <QToolButton>
#include <QPushButton>
#include <QGridLayout>

class StylesheetTest : public QDialog
{
    Q_OBJECT
public:
    StylesheetTest(QWidget * parent = nullptr) : QDialog(parent)
    {
        // Create the widgets and layouts
        itsLayout = new QGridLayout;
        itsMainButton = new QPushButton;
        itsDropdownButton = new QToolButton;

        // Place the widgets in the layout:
        itsLayout -> addWidget(itsMainButton, 0, 0, 1, 2);
        itsLayout -> addWidget(itsDropdownButton, 0, 1, 1, 1);
        itsLayout -> setSpacing(0);
        itsLayout -> setColumnStretch(0, 1);
        itsMainButton -> setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Fixed);
        itsDropdownButton -> setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Fixed);
        itsDropdownButton -> setArrowType(Qt::DownArrow);

        // Formally appoint the layout
        setLayout(itsLayout);

        // Now the stylesheet settings
        setStyleSheet("QToolButton { border: none; } ");

        // Give the button a label
        itsMainButton -> setText("An extraordinarily long label for a button");
    }

private:
    QPushButton *itsMainButton;
    QToolButton *itsDropdownButton;
    QGridLayout *itsLayout;
};

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    StylesheetTest t;
    t.show();
    return a.exec();
}

#include "main.moc"

これは私をそこに連れて行きます。結果のボタンは次のようになります。

最初の試み

これは QComboBox に非常によく似ていますが、QPushButton と QToolButton の独立した動作を希望どおりに取得できます。しかし、私はそれをさらに良くしたいと思います:

  • テキストが矢印と重ならないように、QPushButton の右側に少しマージンを設定したいと思います。
  • 矢印自体をもう少し小さくしてほしい

スタイルシートについて私が知っていることはすべて(確かにそれほど多くはありません)、これを達成するには似たものが必要であることがわかります

    // Now the stylesheet settings
    setStyleSheet("QPushButton { padding-right: 20px; }");
    setStyleSheet("QToolButton { border: none; } "
                  "QToolButton::down-arrow { width: 8px; height: 8px; }" );

しかし実際には、これの結果はめちゃくちゃです:

2 回目の試行 - はるかに悪い

さらなる実験では、QPushButton の 'padding-right' パラメータを任意の値に設定しようとすると、このように垂直方向の高さが圧迫され、下向き矢印のサイズを変更しようとするとすべて失敗することが示されています。私は明らかに何か間違ったことをしていますが、何がわかりません。どんなヒントもありがたく受け取るでしょう。

アップデート

QPushButton の前に QToolButton を使用し、手動で QListView の動作を実装するよりも、QComboBox の前に QPushButton を配置して、後者の矢印を露出させる方が良いと判断しました。このような:

#include <QtWidgets/QApplication>

#include <QDialog>
#include <QPushButton>
#include <QComboBox>
#include <QGridLayout>

class StylesheetTest : public QDialog
{
    Q_OBJECT
public:
    StylesheetTest(QWidget * parent = nullptr) : QDialog(parent)
    {
        // Create the widgets and layouts
        itsLayout = new QGridLayout;
        itsMainButton = new QPushButton;
        itsHiddenComboBox = new QComboBox;

        // Place the widgets in the layout:
        itsLayout -> addWidget(itsHiddenComboBox, 0, 0, 1, 3);
        itsLayout -> addWidget(itsMainButton,     0, 0, 1, 2);
        itsLayout -> setSpacing(0);
        itsLayout -> setColumnStretch(0, 1);
        itsLayout -> setColumnMinimumWidth(2, 20);
        itsMainButton -> setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Minimum);
        itsHiddenComboBox -> setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Minimum);
        setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Maximum);

        // Formally appoint the layout
        setLayout(itsLayout);

        // Now the stylesheet settings
        setStyleSheet("QPushButton { border: none; padding-left: 10px; } ");
        itsMainButton -> setText("An extraordinarily long label for a button");
    }

private:
    QPushButton *itsMainButton;
    QComboBox   *itsHiddenComboBox;
    QGridLayout *itsLayout;
};

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    StylesheetTest t;
    t.show();
    return a.exec();
}

#include "main.moc"

このソリューションの 1 つの欠点は、QPushButton から境界線を削除したため、クリックされても目に見えて反応しなくなったことです (通常の信号が送信されても​​)。これは別の場所で文書化されています: hereを参照してください。私の最終的な意図は QPushButton を押してカーソルを変更することであり、これにより、ボタンが正常にクリックされたことをユーザーに十分に明らかにすることができるので、たまたまこれに対処できます。

4

0 に答える 0