Название: Изображения в QTableView
Отправлено: carlos13 от Октябрь 14, 2009, 02:34
В табличке есть поле BLOB, где хранятся картинки разного размера. Необходимо их выводить в столбец грида к приведенному виду, например 24*24.
Прошу поделиться решениями (или ссылками на них), т.к. предполагаю, что это достаточно типовая задача.
Спасибо.
Название: Re: Изображения в QTableView
Отправлено: cya-st от Октябрь 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; }
Название: Re: Изображения в QTableView
Отправлено: carlos13 от Октябрь 15, 2009, 05:39
К сожалению, не то. Мне скорее пример про делегаты и как через них отображать QLabel в определенном столбце.
Название: Re: Изображения в QTableView
Отправлено: break от Октябрь 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); */ }
Название: Re: Изображения в QTableView
Отправлено: carlos13 от Октябрь 19, 2009, 02:43
break, спасибо! Это то, что нужно!
|