将Qt样式表应用于QPushButton和QToolButton

时间:2015-06-03 21:07:27

标签: qt stylesheet qpushbutton qtoolbutton

我尝试创建一个与QComboBox具有相似行为的小部件,但具有不同的行为,具体取决于用户是单击箭头还是小部件上的其他位置。对于初学者,我将小部件本身建模为宽QPushButton,并在其上叠加QToolButton。一旦我按照我想要的那样查看,我将添加一个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"

这让我大部分都在那里;结果按钮如下所示:

First attempt

它看起来非常像QComboBox,但我得到了QPushButton和QToolButton的独立行为,就像我想要的那样。但是,我想让它变得更好:

  • 我想在QPushButton的右侧设置一点边距,这样文字就不会与箭头重叠
  • 我希望箭头本身更小一些

我所知道的关于样式表的一切(事实上并不是很多)告诉我,要实现这一点,我需要类似的东西

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

但实际上结果是一团糟:

Second attempt - much worse

进一步的实验表明,尝试设置&#39;填充权限&#39;任何值的QPushButton的参数都会导致其垂直高度以这种方式被挤压,而所有尝试修改向下箭头的大小都会失败。我显然做错了什么,但我看不清楚。我们将非常感激地收到任何提示。

更新

我已经决定采用更好的方法,而不是在QPushButton前面使用QToolButton并手动实现QListView行为,将QPushButton放在QComboBox前面,只需后者即可。 s箭暴露。像这样:

#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"

这个解决方案的一个缺点是,消除了QPushButton的边界后,它不再明显响应被点击(即使发送了通常的信号)。这已在其他地方记录:见here。碰巧我可以解决这个问题,因为我的最终目的是按下QPushButton来改变光标,这样就可以让用户明白按钮已被成功点击。

0 个答案:

没有答案