QPushButton: 如何对齐图标和文本

3
使用Qt C++,我有一些带图标和文本的按钮。由于所有按钮的文本长度不同,因此图标没有对齐:

enter image description here

我尝试使用QToolButton代替:
button->setToolButtonStyle( Qt::ToolButtonTextBesideIcon );
button->setSizePolicy( QSizePolicy( QSizePolicy::Policy::Expanding, button->sizePolicy().verticalPolicy() ) );

但是没有成功,无法将文本居中,最终得到了这个结果:

输入图片描述

有没有一种方法可以使图标垂直对齐,同时文本仍然保持居中,就像这样:

输入图片描述

2个回答

4
您可以通过子类化QPushButton来实现。以下是最简功能的示例:
class MyButton : public QPushButton {
public:
  explicit MyButton(QWidget* parent = nullptr) : QPushButton(parent) {}
  virtual ~MyButton() {}

  void setPixmap(const QPixmap& pixmap) { m_pixmap = pixmap; }

  virtual QSize sizeHint() const override {
    const auto parentHint = QPushButton::sizeHint();
    // add margins here if needed
    return QSize(parentHint.width() + m_pixmap.width(), std::max(parentHint.height(), m_pixmap.height()));
  }

protected:
  virtual void paintEvent(QPaintEvent* e) override {
    QPushButton::paintEvent(e);

    if (!m_pixmap.isNull()) {
      const int y = (height() - m_pixmap.height()) / 2; // add margin if needed
      QPainter painter(this);
      painter.drawPixmap(5, y, m_pixmap); // hardcoded horizontal margin
    }
  }

private:
  QPixmap m_pixmap;
};

如果您想在Qt Designer中使用它,只需使用"promote feature"。具体方法请参考这里

非常好,谢谢。本来希望能得到一个更简单的解决方案,但它能用! - jpo38
很高兴能够帮忙。如果您发现更简单的方法,请告诉我们,这也会非常有用。 - cbuchart

3
在这里,您可以看到IGHOR的简单回答:QPushButton图标靠左,文本居中 无需打破UI样式的较少代码方式
pushButton->setIcon(QApplication::style()->standardIcon(QStyle::SP_MessageBoxQuestion));
pushButton->setStyleSheet("text-align:left;");
pushButton->setLayout(new QGridLayout);

QLabel* textLabel = new QLabel("Hello world!");
textLabel->setAlignment(Qt::AlignRight | Qt::AlignVCenter); // or center
textLabel->setAttribute(Qt::WA_TransparentForMouseEvents, true);

pushButton->layout()->addWidget(textLabel);

记得发送setText信号到textLabel而不是pushButton。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接