Russian Qt Forum
Октябрь 01, 2024, 14:24 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: Изображения в QTableView  (Прочитано 4912 раз)
carlos13
Гость
« : Октябрь 14, 2009, 02:34 »

В табличке есть поле BLOB, где хранятся картинки разного размера.
Необходимо их выводить в столбец грида к приведенному виду, например 24*24.

Прошу поделиться решениями (или ссылками на них), т.к. предполагаю, что это достаточно типовая задача.

Спасибо.
Записан
cya-st
Гость
« Ответ #1 : Октябрь 14, 2009, 13:24 »

Пример для VS, но принцип тотже и в QT. Переделать не проблема.
Код
C++ (Qt)
BOOL CBLOBSDlg::ReadFromBLOB(CByteArray & DBArray)
{
 CByteArray Array;
 Array.Copy( DBArray);
 // the header of BLOB is OLE stuff like "Paint Brush Application" .... ecc..
 // the len is 78 byte ( I do not know for other headers )
 int HeaderLen =   78 + sizeof(BITMAPFILEHEADER);
 Array.RemoveAt( 0, HeaderLen ); // I cut all Headers
 
 // some BMP information
 BITMAPINFOHEADER &bmiHeader = *(LPBITMAPINFOHEADER)Array.GetData() ;
 BITMAPINFO &bmInfo = *(LPBITMAPINFO)Array.GetData() ;
 
 
 // If bmiHeader.biClrUsed is zero we have to infer the number
 // of colors from the number of bits used to specify it.
 int nColors = bmiHeader.biClrUsed ? bmiHeader.biClrUsed : 1 << bmiHeader.biBitCount;
 
 LPVOID lpDIBBits;
 if( bmInfo.bmiHeader.biBitCount > 8 )
     lpDIBBits = (LPVOID)((LPDWORD)(bmInfo.bmiColors + bmInfo.bmiHeader.biClrUsed) +
                       ((bmInfo.bmiHeader.biCompression == BI_BITFIELDS) ? 3 : 0));
 else
     lpDIBBits = (LPVOID)(bmInfo.bmiColors + nColors);
 
 
 CClientDC dc(NULL);
 
 HBITMAP hBmp = CreateDIBitmap( dc.m_hDC,   // handle to device context
                                &bmiHeader,     // pointer to bitmap size and format data
                                CBM_INIT,       // initialization flag
                                lpDIBBits,      // pointer to initialization data
                                &bmInfo,        // pointer to bitmap color-format data
                                DIB_RGB_COLORS);                // color-data usage
 
 OleBmp.Attach( hBmp );
 
 Array.RemoveAll(); //Relese Memory
 
 return TRUE;
}
 
Записан
carlos13
Гость
« Ответ #2 : Октябрь 15, 2009, 05:39 »

К сожалению, не то.
Мне скорее пример про делегаты и как через них отображать QLabel в определенном столбце.
« Последнее редактирование: Октябрь 15, 2009, 05:44 от carlos13 » Записан
break
Гипер активный житель
*****
Offline Offline

Сообщений: 846


Просмотр профиля
« Ответ #3 : Октябрь 18, 2009, 01:16 »

у меня есть пример делегата кот. отображает картинку если в ячейке содержится путь к ней (имя файла ), если чуть переделаете подойдет и вам

Код
C++ (Qt)
class CPictureDelegate : public QItemDelegate
{
mutable QPixmap m_pxPicture;
public:
CPictureDelegate( QObject *parent );
 
void paint(QPainter *painter, const QStyleOptionViewItem &option,
const QModelIndex &index) const;
 
//QSize sizeHint(const QStyleOptionViewItem &option, const QModelIndex &index) const;
};


Код
C++ (Qt)
CPictureDelegate::CPictureDelegate( QObject * parent ) : QItemDelegate(parent)
{
}
 
void CPictureDelegate::paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const
{
m_pxPicture.fill( QColor(Qt::white) );
 
const QAbstractItemModel * model = index.model();
QString sFileName = model->data( index, Qt::DisplayRole ).toString();
 
if ( !sFileName.isEmpty() )
m_pxPicture.load( sFileName );
 
//QItemDelegate::paint(painter, option, index);
QPalette::ColorGroup cg = (option.state & QStyle::State_Enabled) ?
 ((option.state & QStyle::State_Active) ? QPalette::Normal : QPalette::Inactive ) :
 QPalette::Disabled;
 
if (option.state & QStyle::State_Selected)
painter->fillRect(option.rect, option.palette.color(cg, QPalette::Highlight));
 
int nX = option.rect.x() + ( ( option.rect.width() - m_pxPicture.rect().width() ) / 2 );
int nY = option.rect.y() + ( ( option.rect.height() - m_pxPicture.rect().height() ) / 2 );
painter->drawPixmap( nX, nY, m_pxPicture );
 
 
drawFocus(painter, option, option.rect.adjusted(0, 0, -1, -1)); // since we draw the grid ourselves
 
/*
QPen pen = painter->pen();
painter->setPen(option.palette.color(QPalette::Mid));
painter->drawLine(option.rect.bottomLeft(), option.rect.bottomRight());
painter->drawLine(option.rect.topRight(), option.rect.bottomRight());
painter->setPen(pen);
*/

}
 
Записан
carlos13
Гость
« Ответ #4 : Октябрь 19, 2009, 02:43 »

break, спасибо!
Это то, что нужно!
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.18 секунд. Запросов: 23.