QPushButton: Как выровнять значок и текст

Используя Qt C++, у меня есть несколько кнопок с иконками и текстом. Поскольку текст всех кнопок не имеет одинаковую длину, значки не выровнены:

Я попытался использовать QToolButton вместо этого:

button->setToolButtonStyle( Qt::ToolButtonTextBesideIcon );
button->setSizePolicy( QSizePolicy( QSizePolicy::Policy::Expanding, button->sizePolicy().verticalPolicy() ) );

Но безуспешно, не удалось центрировать текст, в итоге получилось так:

Есть ли способ, чтобы значки были выровнены по вертикали и текст оставался по центру, вот так:

1 ответ

Решение

Вы можете достичь этого путем подкласса 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, просто используйте функцию продвижения.

Здесь вы можете увидеть простой ответ IGHOR: значок QPushButton выровнен по левому краю с текстом по центру

Меньше кода без нарушения стиля пользовательского интерфейса

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

Другие вопросы по тегам