Custom push-button with text and icon
-
I have a problem with a custom pushbutton I created. My button class inherits from QPushButton that's clear!
Then I create a BoxLayout, vertical or horizontal, and put into it a text and an icon. Or only text or only icon:layout->addWidget(qlabelWithIcon, ...etc) layout->addWidget(qlabelWithText, ...etc)
Then I attach the layout to the pushbutton:
button->setLayout(layout)
It's not good, because the layout is in the z-order over the button, and when I click on it, the receiver of the click-event are the labels with icon or text, and so on...
What's the solution? I could put a transparent button over the labels (icon and text) and routing the click-event to the underlying button.
Or I could set the icon and text labels, as a background for the underlying button (but how???)What would you say? What is the best practice?
-
Hi,
Why do you need a custom button since QPushButton already supports text and icon ?
-
Hi
Adding to to @SGaist , if QPushbutton or QToolButton is not enough icon/text wise,
and what you need it is a clickable QLabel, then why not just make it respond to mouse?
https://wiki.qt.io/Clickable_QLabel -
@peter-70
Hi
Im not sure what you mean with , "The event routing here, is cumbersome "
it will just make the Label be able to emit a clicked()
just like a button does. So it can be connected to a slot and
both work as a button and a QLabel. -
@mrjj
I must catch mouse events and send these as my custom signals. Furthermore I don't know if QLabel receives all the events, such as like a pushbutton.
I have solved my problem with the following code (greatly shortened):this->layout.addWidget(&this->overlay, 0, 0, this->layout.rowCount(), this->layout.columnCount()); QObject::connect(&this->overlay, &QPushButton::pressed, [=]() { emit this->pressed(); }); QObject::connect(&this->overlay, &QPushButton::released, [=]() { emit this->released(); }); QObject::connect(&this->overlay, &QPushButton::clicked, [=](bool checked = false) { emit this->clicked(checked); }); QObject::connect(&this->overlay, &QPushButton::toggled, [=](bool checked) { emit this->toggled(checked); });
Just you can see what's the idea to solve it
edit:
I could imagine the complete solution here, but the code (I think so), is intellectual property of my employer and because of my secrecy, I do not want to do it. I hope you understand