Рисование на QPixmap, который находится в QListWidget

У меня есть список QListWidgetItem в QListWidget (есть полоса прокрутки Hor, так как количество элементов огромно). Каждый QListWidgetItem содержит QPixmap как данные (уменьшенные до некоторого случайного значения). Мое требование - когда щелкают QPixmap, который должен быть выделен (закругленный прямоугольник с шириной кисти 10). Я делегирую каждый QListWidgetItem QItemDelegate. У меня есть пара вопросов здесь.

  1. Как нарисовать закругленный прямоугольник QPixmap, когда выбран соответствующий QListWidgetItem?

  2. Вышеупомянутое событие рисования должно происходить при щелчке QPixmap (но не в других частях QListWidgetItem). Поскольку QPixmaps имеют разные размеры, верхняя и нижняя части QPixmaps в QListWidgetItem будут пустыми, и щелчок по ним также вызовет ItemDelegate. Как избавиться от этого выделения?


person Gokulakrishnan Gopalakrishnan    schedule 07.03.2012    source источник


Ответы (1)


Я не знаю, возможно ли это с QListWidget, потому что я никогда этого не делал. Однако я делаю это с помощью QListView, пользовательской модели и делегата. Суть сводится к следующему:

Внутри моей пользовательской модели QAbstractListModel:

QVariant data(const QModelIndex &index, int role) const
{
    if(index.isValid())
    {
        switch(role)
        {
            case MyCustomRole:
                return QVariant(*pointerToMyQPixmap);
            break;
...

Внутри моего пользовательского QStyledItemDelegate:

void paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const
{

...

    // Best make DAMN sure it's not null else we will crash and burn.
    QPixmap pix = index.data(myCustomRole).value<QPixmap>();
    painter->drawPixmap(1, 1, pix);

...

На мой взгляд, фреймворк Qt Model/View довольно хромой, но пока они не придут в себя, это то, чему вам придется учиться, если вы хотите что-то еще, кроме основных функций встроенных виджетов, которые они предоставляют в фреймворке. Другими словами, если вам нужна дополнительная функциональность с QListWidget, вам нужно изучить QListView и реализовать свою собственную модель и представление.

http://qt-project.org/doc/qt-4.8/qlistview.html#details

person Community    schedule 07.03.2012
comment
Спасибо за ответ. Я также сделал что-то подобное в ListWidget. При рисовании измененного Qpixmap в listItem в методе Delegate::paint() нам нужно указать координаты, где рисуется QPixmap. Мой вопрос в том, как найти эти координаты, поскольку мой QPixmap выровнен по центру. option.rect().x() и y() дает значение верхней левой координаты элемента. Есть ли способ выровнять по центру? или нам нужно считать вручную? - person Gokulakrishnan Gopalakrishnan; 08.03.2012
comment
У меня проблемы с пониманием того, что вы делаете :-) Возможно, вы могли бы уточнить, что вы делаете с QPixmap и зачем вам нужны координаты для чего бы то ни было. - person ; 08.03.2012
comment
Позвольте мне рассказать мою актуальную проблему. В каждом элементе списка у меня есть QPixmap. Каждый QPixmap имеет переменные размеры. Если я щелкну элемент списка, соответствующее изображение должно быть выделено таким образом, что вокруг этого изображения должен быть нарисован прямоугольник со скругленными углами. Итак, в методе рисования делегата я получаю данные (QPixmap) и рисую вокруг них закругленный прямоугольник. Затем я хочу нарисовать обновленный QPixmap в ListWidgetItem с выравниванием по центру. Для рисования QPixmap нам нужно указать QRect. В любом случае мы можем вручную рассчитать геометрию для выравнивания по центру, но я хочу знать, есть ли лучший подход - person Gokulakrishnan Gopalakrishnan; 08.03.2012
comment
Я открыл отдельный поток для выравнивания по центру: stackoverflow.com/questions/9614586/ Но я хотел знать, есть ли лучший подход для выделения (рисования закругленного прямоугольника) QPixmap для моих требований - person Gokulakrishnan Gopalakrishnan; 08.03.2012