创建一个2行(不包装)QPushButton

时间:2018-03-23 15:04:26

标签: c++ qt custom-controls multiline qpushbutton

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

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

我需要能够单独设置2行文本(甚至使用不同的文本大小)。不是文本包装。

我将继承QPushButton,设置网格布局,并添加图标和2个QLabel。添加setText2()text2()。看似简单。

我见过人们建议这个"只是子类xx控件并添加你自己的布局"但从来没有一个真正的非破坏性的例子。

我的问题:

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

我一直在寻找,我找不到QPushButton的绘图元素(QIcon和文本的容器) - 如果至少我能找到它们会帮助我,所以我可以使用它们制作自己的布局。 / p>

1 个答案:

答案 0 :(得分:1)

在进行子类化之前,我会尝试将布局添加到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);
}

安排小部件的代码可以用专门的方法移动。

为什么不继承QPushButtonQAbstractButton,这似乎是合乎逻辑的选择?最实际的原因是:像setTextsetIcon这样的方法在这个类中没有任何意义(甚至是危险的)。更好地通过安全代理公开标签和按钮方法(和信号),并且只显示所需的代码。