В первом случае вам нужно реструктурировать класс CustomButton, я не понимаю, почему он наследует от QWidget, будучи способным наследовать непосредственно от QPushButton.
С другой стороны, для обоих QLabel
sчтобы занимать равноудаленные части, необходимо использовать QHBoxLayout
.
QLabels
должно иметь выравнивание Qt::AlignCenter
.
qss не может выполнять условия многих уровней, только обрабатывать псевдо-состояния, например, в следующем коде:
"QButton:hover QLabel {"
"background-color:blue;"
"}"
QLabel
не изменится при вводе мыши в кнопку, даже если QButton
исправлено на QPushButton
.
Для обработки изменений я буду использовать события enterEvent
и leaveEvent
.
Если вы хотите, чтобы нужный элемент имел одинаковую ширину, вы всегда должны использовать setFixedWidth()
.
Код:
custombutton.h
#ifndef CUSTOMBUTTON_H
#define CUSTOMBUTTON_H
#include <QLabel>
#include <QPushButton>
class CustomButton : public QPushButton
{
Q_OBJECT
public:
explicit CustomButton(QWidget *parent = nullptr);
protected:
void enterEvent(QEvent *event);
void leaveEvent(QEvent *event);
private:
QLabel left;
QLabel right;
const QString leftqss = "QLabel { "
"background-color:blue;"
"}";
const QString rightqss = "QLabel { "
"background-color:red;"
"}";
};
#endif // CUSTOMBUTTON_H
custombutton.cpp
#include "custombutton.h"
#include <QVBoxLayout>
CustomButton::CustomButton(QWidget *parent) : QPushButton(parent)
{
move(10, 20);
setCursor(Qt::PointingHandCursor);
right.setFixedWidth(50);
left.setText("Left");
right.setText("Right");
left.setAlignment(Qt::AlignCenter);
right.setAlignment(Qt::AlignCenter);
QHBoxLayout *hlay = new QHBoxLayout(this);
hlay->addWidget(&left);
hlay->addWidget(&right);
hlay->setContentsMargins(0, 0, 0, 0);
hlay->setSpacing(0);
left.setStyleSheet(leftqss);
right.setStyleSheet(rightqss);
left.adjustSize();
right.adjustSize();
}
void CustomButton::enterEvent(QEvent *event)
{
left.setStyleSheet(rightqss);
right.setStyleSheet(leftqss);
QPushButton::enterEvent(event);
}
void CustomButton::leaveEvent(QEvent *event)
{
left.setStyleSheet(leftqss);
right.setStyleSheet(rightqss);
QPushButton::leaveEvent(event);
}
главное окно.cpp
...
CustomButton* custom = new CustomButton(this);
// Stable a new width to visualize that the right item always has the same width
custom->resize(200, custom->height());
...
Полный код можно найти по следующей ссылке .