2012-03-07 6 views
0

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

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

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

ответ

0

Я не знаю, возможно ли это с помощью 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 является но до тех пор, пока они не опомнится, вам нужно научиться, если вы хотите чего-то другого, кроме основных функций встроенных виджетов, которые они предоставляют в рамках. Другими словами, если Вы желаете больше функциональных возможностей с QListWidget, вам нужно доучиться на QListView и реализовать свою собственную модель и посмотреть

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

+0

Спасибо за ответ. Я также сделал что-то подобное в ListWidget. При покраске измененного Qpixmap в listItem в методе Delegate :: paint() нам нужно указать координаты, в которых рисуется QPixmap. Мой вопрос заключается в том, как найти эти координаты, так как мой QPixmap выравнивается по центру. option.rect(). x() и y() задает значение левого координаты элемента. Есть ли способ выравнивания центра краски? или нам нужно вычислить вручную? –

+0

У меня возникли проблемы с выяснением того, что вы делаете :-) Возможно, вы можете быть более конкретным с тем, что вы делаете с QPixmap, и почему вам нужны координаты для чего угодно. –

+0

Позвольте мне рассказать о моей реальной проблеме. В каждом listItem у меня есть QPixmap. Каждый QPixmap имеет переменные размеры. Если я нажму кнопку listItem, соответствующее изображение должно быть выделено таким образом, чтобы вокруг этого изображения было обращено Rounded rect. Итак, в методе обработки делегата я получаю данные (QPixmap) и рисую закругленный прямоугольник вокруг него. Затем я хочу нарисовать обновленный QPixmap в элементе ListWidgetItem в Центре. Для рисования QPixmap нам нужно указать QRect. В любом случае мы можем вручную вычислить геометрию для выравнивания по центру, но я хочу знать, есть ли лучший подход –