Narysowanie zaznaczenia elementu ktory ma focus w QListWidget

0
struct Thumbnails
{
   std::string imagePath;
   std::string name
   bool checked
}

std::vector<Thumbnails> lista 

I chciałem wyswietlić vector w Qt ,
znalazłem QListWidget i wszystko było by pieknie
tylko że strzałki na klawiaturze nie zaznaczają ktory obiekt ma aktualnie fokus w QListWidget jezeli elementem jest moj widget

zrobilem wiec prosty przykład
elementy "Item A" można zaznaczyć klawiatura
elementy "Item B" nie mozna zaznaczyc klawiatura bo tu jest moj Widget (w przykładzie QLabel)

eksperymentowałem ze stylami z pseudo-states https://doc.qt.io/qt-5/stylesheet-reference.html#list-of-pseudo-states
ale zaznaczanie aktywnego elementu nie działa

Finalne pytanie: jak zrobic aby elementy "Item B" miały narysowane zaznaczenie elementu aktywnego (tzw. fokus)

Czy może: oczekuje od gąski orlich piór i głosu słowika ? I nie tedy droga do osiągnięcia celu

#include <QApplication>
#include <QListWidget>
#include <QListWidgetItem>

#include <QPainter>
#include <QStyleOption>
#include <QPixmap>
#include <QLabel>

std::string styleSTR = R"style(
    QLabel
    {
        background-color:blue;
        border-radius: 35px;
        font: bold 22px;
        border-width: 2px;
        border-style: solid;
        border-color: rgb(177, 77, 77);
    }
    
    QLabel:hover , QLabel:selected
    {
        background-color:yellow;
    }
)style";


int main(int argc, char *argv[])
{
    QApplication a(argc, argv);


    QListWidget listWidget;

    // te elementy maja narysowany focus elementu 
    for(int i = 0 ; i < 3; ++i)
    {
        QListWidgetItem *itemLV = new QListWidgetItem(&listWidget);
        itemLV->setText("Item A");
        itemLV->setSizeHint(QSize(150, 120));
    }


    // te elementy NIE MAJĄ narysowanego focus-a elementu 
    for(int i = 0 ; i < 3; ++i)
    {
        // Add an item to list widget.
        QListWidgetItem *item = new QListWidgetItem();
        item->setSizeHint(QSize(150, 150));
        listWidget.addItem(item);

        auto *addItemWidget = new QLabel;// Thumbnails(&listWidget);
        addItemWidget->setText("Item B");
        addItemWidget->setStyleSheet(QString::fromStdString(styleSTR));
        addItemWidget->resize(100,100);
        listWidget.setItemWidget(item, addItemWidget);
    }


    listWidget.setIconSize(QSize(128*2,128));
    listWidget.setResizeMode(QListView::Adjust);//(QListView::Fixed);
    listWidget.setViewMode(QListView::IconMode);


    listWidget.resize(800,600);
    listWidget.show();
    return a.exec();
}

image

1

QT trochę bazuje na webówce, strzelam na ślepo, że będzie coś w stylu.

Styl QLabel:focus { background-color: yellow; }
i itemLV.setFocus()

W javascript by to wyglądało podobnie tylko zamiast .setFocus zwykłe document.querySelector('element').focus()

0

A przypadkiem nie jest to po prostu kwiestia: https://doc.qt.io/qt-6/qlistwidgetitem.html#setFlags
i właściwe skonfigurowanie tych flag?

setStyleSheet na poszczególnych widgetach IMO jest dziwnym podejściem.
Najlepiej to ustawiać na QApplication, żeby miał globalny efekt.

0

@MarekR22: poszedlem tym tropem ale domyslny stan wydaje sie poprawny "
QFlags<Qt::ItemFlag>(ItemIsSelectable|ItemIsDragEnabled|ItemIsUserCheckable|ItemIsEnabled)

kolejny trop to zmiana ViewMode na ListMode , i wtedy domyślne zaznaczenie działa poprawnie tylko że zaznaczony jest caly wiersz.
Niestety ja potrzebuje trybu IconMode

2

Rozwiązanie:

QListView::item:selected { background: blue }

1 użytkowników online, w tym zalogowanych: 0, gości: 1