C++ 创建双线(不换行)QPushButton

C++ 创建双线(不换行)QPushButton,c++,qt,custom-controls,multiline,qpushbutton,C++,Qt,Custom Controls,Multiline,Qpushbutton,我必须创建一个包含一个图标和两行文本的QPushButton 理想情况下,我应该能够将图标放在左侧(在一个设计上)或中间,文本上方(在另一个视图中的另一个设计) 我需要能够单独设置的两行文本(甚至不同的文本大小)。不是文本换行 我将子类化aQPushButton,设置网格布局,并添加图标和2个qlabel。添加setText2()和text2()。看起来很简单 我见过有人建议“只需将xx控件子类化并添加您自己的布局”,但从未使用过实际的非破坏性示例 我的问题: 如何利用QPushButton的所

我必须创建一个包含一个图标和两行文本的
QPushButton

理想情况下,我应该能够将图标放在左侧(在一个设计上)或中间,文本上方(在另一个视图中的另一个设计)

我需要能够单独设置的两行文本(甚至不同的文本大小)。不是文本换行

我将子类化a
QPushButton
,设置网格布局,并添加图标和2个qlabel。添加
setText2()
text2()
。看起来很简单

我见过有人建议“只需将xx控件子类化并添加您自己的布局”,但从未使用过实际的非破坏性示例

我的问题:

如何利用
QPushButton
的所有内置属性和事件?我必须做些什么来确保我有正确的调整大小事件,并且我为第一行文本添加的图标和标签是
QPushButton
的实际图标和文本,以便正确应用它们


我一直在搜索,但找不到QPushButton(QIcon和文本的容器)的绘图元素-如果至少我能找到这些元素,那将对我有所帮助,这样我就可以使用它们来创建自己的布局。

在子类化之前,我会尝试将布局添加到
QPushButton
,并将所需的小部件添加到布局中。为了把事情放在一起,我宁愿子类
QWidget
,并有这样一个类:

class CustomButton : public QWidget
{
public:
  explicit CustomButton(QWidget * parent);

private:
  QPushButton button;
  QLabel * icon;
  QLabel * line1;
  QLabel * line2;
};
只需添加公共方法来设置图标和文本行:

public:
  void setTextLines(QString & l1, QString & l2)
  {
    line1->setText(l1);
    line2->setText(l2);
  }

  void setIcon(QPixmap & pixmap)
  {
    icon->setPixmap(pixmap);
  }
和一个自定义信号:

signals:
  void clicked();
这是一个可能的构造函数,其中小部件被实例化,信号直接连接到按钮信号:

CustomButton::CustomButton(QWidget *parent)
{
  button = new QPushButton();
  icon = new QLabel(); //use a label to host the icon
  line1 = new QLabel();
  line2 = new QLabel();

  connect(button, SIGNAL(clicked(bool)), this, SIGNAL(clicked()));

  QHBoxLayout * hl = new QHBoxLayout();
  hl->addWidget(icon);

  QVBoxLayout * vl = new QVBoxLayout();
  vl->addWidget(line1);
  vl->addWidget(line2);

  hl->addLayout(vl);
  button->setLayout(hl);

  QGridLayout * gl = new QGridLayout();
  gl->addWidget(button);

  setLayout(gl);
}
排列小部件的代码可以用专门的方法移动


为什么不将
QPushButton
QAbstractButton
子类化,这似乎是合乎逻辑的选择?最实际的原因是:像
setText
setIcon
这样的方法在这个类中不再有意义(甚至是危险的)。通过安全代理公开标签和按钮方法(和信号)更好,并且只公开所需的标签和按钮方法。

为什么不能简单地这样做:
QPushButton按钮(“Line1\nLine2”)?@vahancho:如果我不能做一个自定义按钮,那将是我必须做的。但我的要求包括自定义布局(图标下的文本作为选项)和两行的不同字体大小,这是纯文本无法实现的。这是我正在尝试做的-但我需要能够在执行期间将文本和图标设置为按钮。。。这意味着我必须让图标成为按钮的已知图标,并且文本也是按钮的一部分。@Thalia我编辑了答案以解决您的问题。我至少必须使用QPushButton或QAbstractButton。除其他外,此对象用作QAbstractButtonList列表中的成员,用作QButtonGroup中的选项,用作另一个按钮中的按钮。。。我不会随意选择我的类型。我的整个问题是:如何使用父按钮图标和文本-因为阅读qt代码时,似乎没有任何挂钩,除非我重写绘画和许多其他函数。。据我所知,您的答案是,我不能也不应该尝试。@Thalia当然,您可以将
QPushButton
子类化并覆盖绘制事件。我建议了一种不太复杂的方法,但不幸的是,它看起来不适合你的需要。