我尝试创建一个与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"
这让我大部分都在那里;结果按钮如下所示:
它看起来非常像QComboBox,但我得到了QPushButton和QToolButton的独立行为,就像我想要的那样。但是,我想让它变得更好:
我所知道的关于样式表的一切(事实上并不是很多)告诉我,要实现这一点,我需要类似的东西
// Now the stylesheet settings
setStyleSheet("QPushButton { padding-right: 20px; }");
setStyleSheet("QToolButton { border: none; } "
"QToolButton::down-arrow { width: 8px; height: 8px; }" );
但实际上结果是一团糟:
进一步的实验表明,尝试设置&#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来改变光标,这样就可以让用户明白按钮已被成功点击。