Qt: QPushButton-ön lévő ikonok igazítása

 ( szotsaki | 2009. szeptember 15., kedd - 18:47 )

Van egymás alatt négy-öt gombom, és mindegyik kapott egy szép ikont is. Az a gond, hogy a szövegek különböző hosszúságúak, így az ikonok is össze-vissza helyezkednek el egymás alatt, ami elég zavaróan néz ki. Hogyan tudom megmondani, hogy az ikonok legyenek balra igazítottak?

A következőket próbáltam:

  1. átnéztem a QPushButton dokumentációját, de semmit nem ír az ikon áthelyezéséről
  2. CSS-ből meghatározni ezt a text-align: right; segítségével; de azt írja, hogy az ikont együtt igazítja a szöveggel
  3. az egyik Qt-s gyakorlóban végigvezetnek, hogyan kell a Javás Metal stílust elkészíteni. Ott egy kódrészletben manuálisan adják meg az ikon távolságát, mindenféle plusz, kívülről állítható változó figyelembevétele nélkül:
    if (!btn->icon.isNull()) {
             pix = btn->icon.pixmap(btn->iconSize, btn->state & State_Enabled ? QIcon::Normal : QIcon::Disabled);
             drawItemPixmap(p, btn->rect, alignment, pix);
             if (btn->direction == Qt::RightToLeft)
                 textRect.setRight(textRect.right() - btn->iconSize.width() - 4);
             else
                 textRect.setLeft(textRect.left() + btn->iconSize.width() + 4);
         }
         if (!btn->text.isEmpty()){
             drawItemText(p, textRect, alignment | Qt::TextShowMnemonic,
                 btn->palette, btn->state & State_Enabled, btn->text, QPalette::WindowText);
         }
    
  4. ... és persze Google és forráskódelemzés is megvolt.

Ha valaki tudja erre a megoldást, kérem, ne tartsa magában :)

Hozzászólás megjelenítési lehetőségek

A választott hozzászólás megjelenítési mód a „Beállítás” gombbal rögzíthető.

Megnéztem a QCommandLinkButtont és nekem úgy tűnik az hasonlóan viselketdik mint amit te szeretnél.

Köszönöm szépen, holnap mindenképpen kipróbálom!

--
Elder Scrolls

Köszi szépen, megnéztem; tényleg balra pakolja az ikonokat, viszont semmibe veszi az Oxygen stíluslapját (és valószínű, ha Vistán futtatom, akkor pedig teljesen máshogy fog kinézni, illetve igaz ez XP-re is).

--
Elder Scrolls

Nem igazan jött le hogy most hogy kuszalodik neked ossze.

A gomboknak van ikonja es szovege (belul a gombban) es ezert a hosszuk kulonbozo,
vagy a bombon kivul elotte van a szoveg ezert horizontalisan mashol kezdodnek?

Nem tudsz egy kepernyokepet mutatni rola?

+ Designert hasznalsz, vagy kezzel rendezed a layoutokat? (csak hogy milyen megoldast mondjunk neked/ha tudunk/)

Készítettem egy képet, így néz ki: http://img401.imageshack.us/img401/8347/temp1l.png
Valahogy ezt kéne egységesíteni (az ikonokat egy oszlopba tenni), mert nehéz átlátni a sok kis grafika miatt; ikonok meg kellenek rá :)

--
Elder Scrolls

Aha így mar vilagos mit akarsz.
Most nem bogarásztam végig a QPushButton beállitasait, hogy be lehet-e állitani ezt(gondolom ezt te már megtetted), de ha nem megy akkor legrosszabb esetben csináld meg kézzel:
Azaz ne írj a gombra semmit, csinálj rá egy QHBoxLayout-ot, berakod az ikont, aztán egy QLabelt, aztan egy Strentch- et.
Ha a Margin/Spacing ertekeket beallitod a Layoutban(kissebbre a defaultnál) akkor eszre sem lehet majd venni a különbséget.
Ha igazán elegánsan akarod csinálni akkor a QPushButton -ból örököltetsz egy saját osztályt amiben ezt megcsinálod és akkor mindenütt ezt használod.

Első körben hirtelen ez a tippem.

Szerk: Az sem gond ha ezt designerrel teszed, akkor kell használni a "Promote To..." opciót, megadod hogy a QPushButton az ősosztály és akkor szuperül pakolhatod le a gombokat.

Hejj megint tanultam valamit ezzel a Promote to.. opcióval :)
Köszi.

Köszönöm szépen a segítséget, sikerült megoldanom a problémát. Egy újabb osztályt kellett származtatnom a QPushButton-ből, majd annak felül kellett definiálni a paintEvent() függvényét.

Íme a kód:

void PushButton::paintEvent(QPaintEvent *)
{
	QStylePainter painter(this);
	QStyleOptionButton option;
	initStyleOption(&option);

	short shiftHorizontal = option.state & QStyle::State_Sunken ? QApplication::style()->pixelMetric(QStyle::PM_ButtonShiftHorizontal) : 0;
	short shiftVertical = option.state & QStyle::State_Sunken ? QApplication::style()->pixelMetric(QStyle::PM_ButtonShiftVertical) : 0;
	short buttonMargin = QApplication::style()->pixelMetric(QStyle::PM_ButtonMargin);
	QRect pixmapRectangle(buttonMargin + shiftHorizontal, shiftVertical, option.rect.width() - buttonMargin, option.rect.height());
	QRect textRectangle(pixmapRectangle.left() + 5 + shiftHorizontal, shiftVertical, option.rect.width() - buttonMargin, option.rect.height());

	painter.drawControl(QStyle::CE_PushButtonBevel, option);
	painter.drawItemPixmap(pixmapRectangle, Qt::AlignLeft | Qt::AlignVCenter, icon().pixmap(iconSize().width()));
	painter.drawItemText(textRectangle, Qt::AlignHCenter | Qt::AlignVCenter, option.palette, isEnabled(), text());
	painter.drawPrimitive(QStyle::PE_FrameFocusRect, option);
}

A legjobb benne, hogy 15 sorból megvan az egész :)

Nagyjából stílusfüggetlen, kezeli a benyomott gombok szövegének és ikonjának eltolását, vízszintesen és függőlegesen középre van igazítva a szöveg, az ikon pedig a gomb bal oldalán foglal helyet.

--
Elder Scrolls