QComboBox dekorálása

 ( csfeco | 2017. május 7., vasárnap - 9:49 )

Sziasztok!

A Qt-ban a QComboBox dekorálásával akadtam el. Addig megvan, hogy a listában, a modellen keresztül meg tudom határozni a sorok színét, és a fontot. Csakhogy, amikor kiválasztom az elemet, akkor az aktuális elem már az alapértelmezett fonttal. és színnel jelenik meg.
Próbáltam a QComboBox-ban a QLineEdit widget-ben beállítani a színt és fontot, de ez csak addig jó, amíg a QComboBox-on van a fókusz, ha másik egy widgeten, akkor a QComboBox üres lesz.
Ha a QComboBox-on állítom be a színt és a fontot, elkapva a currentIndexChanged(int) szignált, akkor meg a font dekoráció nem ok. Ha kiválasztok egy elemet áthúzott fonttal, akkor utána a lenyíló listában minden elem áthúzott lesz, az lenyílóban is a QComboBox-ra beállított font dekoráció érvényes, ne az amit a model data() metódusa visszaad.
( a kód: https://github.com/csikfer/lanview2/blob/master/lv2g/lv2models.cpp ,a SLOT az 524 sorban.)
Meg lehet ezt csinálni rendesen? (Szerintem így kéne működnie, de nincs nyoma, hogy ezt más is így akarná, vagy szeretné.)

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ő.

>> Ha kiválasztok egy elemet áthúzott fonttal, akkor utána a lenyíló listában minden elem áthúzott lesz, az lenyílóban is a QComboBox-ra beállított font dekoráció érvényes, ne az amit a model data() metódusa visszaad

Qt 5.8.0 Linux Nálam nem így van.

Miután kiválasztottam az elemet a setStyleSheet-el beállítottam a comboboxnak az aktív elem stílusát. Ezek után a lenyíló popupban csak az veszi fel ezt a stilust aminek nincs megadva az adott tulajdonság. Pl :text-decoration: line-through; hatására csak az az elem lett áthúzva amelyiknek nem volt beállítva a model data metódusnál a fontja.

Próbáltam leírni, hogy ezt csináltam. A listában, ami lenyílik, ott működik is, az színes, font dekoráció (áthúzás, aláhúzás, stb.) is megvan (font családot nem állítok). Ha viszont kiválasztok egy elemet, és nem látszik a lenyíló lista, akkor már nem érvényesek a modellben megadott színek, font dekorációk arra az egy kiválasztott és megjelenített elemre.
Ha beállítom a QComboBox-on a fontot a setFont() metódussal (pl az áthúzást) onnantól kezdve a listán sem jó, mindenhol a QComboBoxra megadott font dekoráció (pl. áthúzás) jelenik meg.
Ha a QComboBox QListBox-ára állítom be a dekorációt, akkor jó, de csak addig, amíg a fókusz rajta van, ha már nincs rajta a fókusz, akkor nem látszik az az egy kiválasztott elem, üres lesz a QLineEdit widget a QComboBox widget-ben.
Talán egy pár képpel egyértelműbb:
A lenyíló lista jó (ha nem állítok be semmit közvetlenül a QComboBox-on):

Ha kiválasztom az elemet, ott nem érvényes a szín, és a font:
(az áthúzott "null" lett kiválasztva.
A QLineEdit-en keresztül beállítva:
majdnem jó, de ha elveszem a fókuszt:
akkor eltűnik a kiválasztott elem.
Egy Ubuntu 16.04-en fejlesztek Qt verzió: 5.5 (elnézést, kicsit ronda lett a képek miatt).

Ok értem. A setStyleSheet nem ilyen agresszív mint a setFont. Nem értem miért, de nem elég neki, hogy legyen beállítva font. Az összes tulajdonságát amit használsz a többi fontnál mindegyiknél be kell állítani.
Pl. ha a combobox setFont metódusát használom a beállításra kiválasztás után, akkor minden font áthúzott lesz aminek nincs beállítva a setStrikeOut(false) a model::data metódusnál . Tehát még így is működik, de a modelnél elég részletesen be kell állítani mindent.

QVariant CBoxModel::data(const QModelIndex &index, int role) const
{
    QVariant ret=QStringListModel::data(index,role);
    switch (role) {
    case Qt::FontRole:
        if (index.row() == 0 ) {
            QFont font;
            font.setBold(true);
            font.setStrikeOut(false);
            ret = font;
        }
        if (index.row() == 1 ){
            QFont font;
            font.setItalic(false);
            font.setStrikeOut(true);
            ret = font;
        }
        if (index.row() == 2 ){
            QFont font;
            font.setBold(false);
            font.setItalic(true);
            font.setStrikeOut(false);
            ret = font;
        }
        if (index.row() == 3 ){
            QFont font;
            font.setItalic(true);
            font.setStrikeOut(false);
            ret = font;
        }
        break;

    case Qt::ForegroundRole:
        if (index.row() == 0 ){
            QColor color(Qt::red);
            ret=color;
        }
        if (index.row() == 1 ){
            QColor color(Qt::blue);
            ret=color;
        }
        if (index.row() == 2 ){
            QColor color(Qt::green);
            ret=color;
        }
        if (index.row() == 3 ){
            QColor color(Qt::yellow);
            ret=color;
        }
        break;
    }
    return ret;
}


void MainWindow::on_comboBox_currentIndexChanged(const QString &arg1)
{
   ui->comboBox->setFont(model.data(model.index(ui->comboBox->currentIndex(),0),Qt::FontRole).value());
   QPalette cBoxPalette=ui->comboBox->palette();
   cBoxPalette.setColor(QPalette::ButtonText, model.data(model.index(ui->comboBox->currentIndex(),0),Qt::ForegroundRole).value());
   ui->comboBox->setPalette(cBoxPalette);
}

eredmény:
https://tinyurl.com/l9fdxu7

Windows 2012 Server, Qt 5.8 rendesen működik, ahogy Te is mondtad.
Ubuntu 16.04 Qt 5.5: Ha beállítom a QComboBox-on a setFont() metódussal a fontot, akkor a modellben már hiába adom meg a fontot, az nem jut érvényre.

Kipróbáltam, Linux 64bit:
5.5.1 és 5.6.0 tényleg nem jó, (tegnap is megnézhettem volna, de nem gondoltam volna, hogy ez a hiba)
5.8.0 jó

Ezek vannak telepítve. Ha kell akkor win32+mingw -vel is megtudom nézni ezeket a verziókat.

Szerintem ennél sokkal több ráfordítást nem ér a dolog. Rajtam kívül nem használja más Linux alatt, mutogatni Windows-on fogom, ott meg jó (leszámítva, hogy lassabb, de még nem zavaró).
Feltettem a gépemre a Qt 5.7-et ott egy fokkal jobb, de nem az igazi, felemásan működik. Viszont nincs menü, csak ha átváltok másik ablakkezelőre :(.

Nem tudom milyen Qt verziót használsz! DE a stylesheet-el szerintem pont ezeket tudod beállitani...ha jól értettem a problémádat.

--
www.autosys.hu