1. 程式人生 > >QTableWidget中表格顯示圖片

QTableWidget中表格顯示圖片

QTableWidget中的表格顯示圖片有幾種方式:

需要先將圖片載入為資源。

1.直接在建立QTableWidgetItem的時候建立,如

tableWdiget->setItem(0,1,new QTableWidgetItem(QIcon(":/image/cpu")," "));

2.通過在item中建立一個label,通過label的setPixMap函式來顯示圖片:

QLabel*label=newQLabel("");
label->setPixmap(QPixmap(":/image/grid").scaled(30,30));
ui->matrixViewTable->setCellWidget(0,i,label);

3.通過繼承 QStyledItemDelegate類使用委託來實現item中顯示圖片:

classQPixmapItemdele:publicQStyledItemDelegate
{
public:
QPixmapItemdele(QObject*parent=0):QStyledItemDelegate(parent){ }
    //在委託類的paint中畫圖
virtualvoidpaint(QPainter*painter,constQStyleOptionViewItem&option,constQModelIndex&index)const
{
if(index.data(Qt
::DisplayRole).canConvert<QPixmap>())
{
QPixmappix=index.data(Qt::DisplayRole).value<QPixmap>();
painter->drawPixmap(option.rect,pix);
}
QStyledItemDelegate::paint(painter,option,index);
}
};
然後為tablewidget設定委託,後面就可以設定具體的某項的圖片:
  ui->matrixViewTable->setItemDelegate(newQPixmapItemdele
());
       //以下是設定第一行的所有列的圖片
    for(inti=0;i<ui->matrixViewTable->columnCount();i++)
{
QTableWidgetItem*item=newQTableWidgetItem();
ui->matrixViewTable->setItem(0,i,item);
item->setData(Qt::DisplayRole,QVariant::fromValue<QPixmap>(QPixmap(":/image/grid").scaled(30,30)));
}

以上三種方法,法一直接在item上建立Icon,則表中每個Item表示為左邊icon,右邊為icon對應的text,即使text為空,也會留出很大的空間出來,導致左邊的icon很小,

可以用以下語句來設定左邊圖示大小:

ui->matrixViewTable->setIconSize(QSize(30,30));

但是右邊還是有text留出來的空間,如果想讓icon充滿整個item,則此方法沒法達成。

法二通過item中建立label來setPixMap的方式可以讓icon充滿整個item,但是顯示出來的icon用滑鼠點選不會有選擇動作發生,或者也許可以處理點選事件(未試過,不知是否能行)。

法三繼承委託能夠讓圖片充滿整個item,同時選擇圖片時,會出現選擇框,不至於像法二一樣點選了沒有任何反應。

以下是法三QWidgetTable使用委託的程式碼(委託類已在上面給出):

ui->matrixViewTable->setItemDelegate(newQPixmapItemdele());
intcolcount=17;
introwcount=2;
ui->matrixViewTable->setColumnCount(colcount);
ui->matrixViewTable->setRowCount(rowcount);
ui->matrixViewTable->horizontalHeader()->setVisible(false);
ui->matrixViewTable->verticalHeader()->setVisible(false);
ui->matrixViewTable->setSelectionMode(ui->matrixViewTable->NoSelection);
ui->matrixViewTable->setEditTriggers(ui->matrixViewTable->SelectedClicked);
ui->matrixViewTable->setShowGrid(false);
ui->matrixViewTable->setFrameShape(QFrame::NoFrame);
constintwidth=30;
for(inti=0;i<ui->matrixViewTable->columnCount();i++)
{
ui->matrixViewTable->setColumnWidth(i,width);
//設定第8列為間隔行,不允許點選或選擇
if(i==8)
{
QTableWidgetItem*itm1=newQTableWidgetItem();
ui->matrixViewTable->setItem(0,i,itm1);
itm1->setFlags(Qt::NoItemFlags);
QTableWidgetItem*itm2=newQTableWidgetItem();
ui->matrixViewTable->setItem(1,i,itm2);
itm2->setFlags(Qt::NoItemFlags);
continue;
}
QTableWidgetItem*item=newQTableWidgetItem();
ui->matrixViewTable->setItem(0,i,item);
item->setData(Qt::DisplayRole,QVariant::fromValue<QPixmap>(QPixmap(":/image/grid").scaled(30,30)));
QTableWidgetItem*item2=newQTableWidgetItem();
ui->matrixViewTable->setItem(1,i,item2);
item2->setData(Qt::DisplayRole,QVariant::fromValue<QPixmap>(QPixmap(":/image/grid").scaled(30,30)));
}
ui->matrixViewTable->setColumnWidth(8,15);
以下是執行生成的效果,每個表格中間是一個圖片:


使用委託能夠在表格中顯示圖片,但是如果要在表格中畫圖,比如畫線,則使用委託畫出來的圖會把線覆蓋掉,也就是線會有畫出來,但是看不到,實際是畫了在圖的下面。

在表格中顯示圖片還有第4種方法,安裝事件過濾器,然後在過濾器函式EventFilter()函式中進行畫圖。因為此處用到的QTableWidget是Widget中的一個控制元件,因此可以安裝事件過濾器,讓Widget監視QTableWidget中的事件。程式碼如下,在類中重寫QWidget類的eventFilter函式,然後建立表格時,每一列就建立為空,在evenFilter函式中檢測到paint事件時才進行將圖片畫到表格中。

classMatrixView:publicQWidget
{
Q_OBJECT
public:
explicitMatrixView(QWidget*parent=0);
~MatrixView();
public:
booleventFilter(QObject*,QEvent*); 
private:
voidInitTableWidget();
boolIsMouseInTableWidget(QEvent*event,QPoint&p);
voidSetPointToCenter(QPoint&);
private:
Ui::MatrixView*ui;
QPointm_beginP;
QPointm_endP;
boolm_bmove;
boolm_brelease;
};
//以下是在建構函式中建立表格,表格其他部分與上面程式碼一樣
m_bmove=false;
m_brelease=false;
//必須是tablewidget的viewport註冊事件過濾才會有滑鼠事件,如果是tablewidget註冊,則收到除了滑鼠事件外的其他事件,也就是滑鼠事件收不到
ui->matrixViewTable->viewport()->installEventFilter(this);

for(inti=0;i<ui->matrixViewTable->columnCount();i++)
{
ui->matrixViewTable->setColumnWidth(i,COL_WIDTH);
//設定第8列為間隔行,不允許點選或選擇
if(i==NULL_COL)
{
QTableWidgetItem*itm1=newQTableWidgetItem();
ui->matrixViewTable->setItem(0,i,itm1);
itm1->setFlags(Qt::NoItemFlags);
QTableWidgetItem*itm2=newQTableWidgetItem();
ui->matrixViewTable->setItem(1,i,itm2);
itm2->setFlags(Qt::NoItemFlags);
continue;
}
QTableWidgetItem*item=newQTableWidgetItem();
ui->matrixViewTable->setItem(0,i,item);
//使用委託顯示圖片
//item->setData(Qt::DisplayRole,QVariant::fromValue<QPixmap>(QPixmap(pixmap).scaled(30,30)));
QTableWidgetItem*item2=newQTableWidgetItem();
ui->matrixViewTable->setItem(1,i,item2);
//item2->setData(Qt::DisplayRole,QVariant::fromValue<QPixmap>(QPixmap(pixmap).scaled(30,30)));
}

//在eventFilter中獲取tablewidget的滑鼠按下、移動,釋放事件,進行畫線,在畫線之前進行畫圖。此處畫圖的效果與法三的效果一樣,且可以在圖上面畫線。如果不需要處理滑鼠事件,此處可以忽略3個滑鼠事件的判斷。

boolMatrixView::eventFilter(QObject*object,QEvent*event)
{
//qDebug("%stype:%d",object->objectName().toStdString().c_str(),event->type());
if(object->objectName()!=QString("qt_scrollarea_viewport"))
{
returnQWidget::eventFilter(object,event);
}
if(event->type()==QEvent::MouseButtonPress)
{
if(IsMouseInTableWidget(event,m_beginP))
{
m_endP=m_beginP;
update();
}
}
if(event->type()==QEvent::MouseButtonRelease)
{
IsMouseInTableWidget(event,m_endP);
m_brelease=true;
SetPointToCenter(m_endP);
update();
}
if(event->type()==QEvent::MouseMove)
{
QMouseEvent*mouseEvent=static_cast<QMouseEvent*>(event);
//不進行判斷左右鍵,如果判斷左右鍵,會導致m_endP有時無值,畫出的線斷斷續續
m_endP=mouseEvent->pos();
m_bmove=true;
update();
}
if(event->type()==QEvent::Paint)
{
QPainterpaint(ui->matrixViewTable->viewport());
//使用paint事件在表格中畫圖
intw=COL_WIDTH;
inth=ui->matrixViewTable->rowHeight(0);
for(inti=0;i<ui->matrixViewTable->columnCount()-1;i++)
{
intx=i>=NULL_COL?i*COL_WIDTH+NULL_COL_WIDTH:i*COL_WIDTH;
inty=0;
inty1=ui->matrixViewTable->rowHeight(0);
QPixmappix(":/image/grid");
paint.drawPixmap(QRect(x,y,w,h),pix);
QPixmappix1(":/image/grid");
paint.drawPixmap(QRect(x,y1,w,h),pix1);
}
//在表格中畫線,線隨滑鼠動
if(m_bmove)
{
QPenpen(Qt::black,5);
paint.setPen(pen);
SetPointToCenter(m_beginP); //取得滑鼠最接近項的中心點
paint.drawPoint(m_beginP);
QPenpen1(Qt::black,3);
paint.setPen(pen1);
paint.drawLine(m_beginP,m_endP);
QPenpen2(Qt::black,5);
paint.setPen(pen2);
paint.drawPoint(m_endP);
}
if(m_brelease)
{
m_bmove=false;
m_brelease=false;
}
}
//此處必須返回基類的eventFilter,以讓基類有機會進行處理其他事情,否則單單返回true,Qtablewidget上面將無其他東西顯示
returnQWidget::eventFilter(object,event);
}

//判斷滑鼠按下的點是否在表格內,可無需關注
boolMatrixView::IsMouseInTableWidget(QEvent*event,QPoint&point)
{
if(event->type()==QEvent::MouseButtonPress||
event->type()==QEvent::MouseButtonRelease||
event->type()==QEvent::MouseMove)
{
QMouseEvent*mouseEvent=static_cast<QMouseEvent*>(event);
if(mouseEvent->button()==Qt::LeftButton)
{
QPointp=mouseEvent->pos();
//檢查滑鼠位置是否點在列表的項中,需要考慮中間空白間隔的那列除外
intcol=p.x()/COL_WIDTH>=NULL_COL?(p.x()+NULL_COL_WIDTH)/COL_WIDTH:p.x()/COL_WIDTH;
introw=p.y()/ui->matrixViewTable->rowHeight(0);
if(col<ui->matrixViewTable->columnCount()&&row<ui->matrixViewTable->rowCount())
{
if(col!=NULL_COL)
{
point=p;
returntrue;
}
}
}
}
returnfalse;
}
//取得最靠近該點的項的中心點,可無需關注
voidMatrixView::SetPointToCenter(QPoint&point)
{
intx=0;
if(point.x()/COL_WIDTH<NULL_COL)
{
x=point.x()/COL_WIDTH*COL_WIDTH+COL_WIDTH/2;
}
else
{
//因為第8列是空列,所以要排除這一列,先將point所在的x座標減去8列前的部分,得到超出8列後的部分,就可以按照取中心點的方法取得這超出後部分的中心點,再加上8列前部分的位置,就得到最終的中心點
intnull_col_end_x=NULL_COL*COL_WIDTH+NULL_COL_WIDTH;
x=null_col_end_x+(point.x()-null_col_end_x)/COL_WIDTH*COL_WIDTH+COL_WIDTH/2;
}
inth=ui->matrixViewTable->rowHeight(0);
inty=point.y()/h*h+h/2;
point=QPoint(x,y);
}
效果 圖:(圖中直線上的折線是抗鋸齒,如果線寬小的話就不會這麼明顯)


相關推薦

QTableWidget表格顯示圖片

QTableWidget中的表格顯示圖片有幾種方式: 需要先將圖片載入為資源。 1.直接在建立QTableWidgetItem的時候建立,如 tableWdiget->setItem(0,1,new QTableWidgetItem(QIcon(":/image/cp

RadioButton無法顯示圖片

RT,求助各位大大,本人在學習開發過程中,RadioButton中需要載入圖片,但8位png圖的(ionicons上下的)無法顯示,而網上找的部分圖片(如圖右邊,是32位png圖)可以正常顯示,請問各位大哥大姐們這是咋回事呀?真的是因為圖片位數的原因?

淺談QTableView和QTableWidget資料表格顯示方式

一、淺談QTableView和QTableWidget資料表格顯示方式 ① QTableView是基於MVC架構,QTableView表格用來做顯示,QStandardItemModel用來做資料模型控制,QStandardItem用來做資料來源,而且是一個單元格一個數據源

element ui表格顯示圖片

    那個api是我介面的字首地址 comImage是介面返回的資料    <el-table-column prop="comImage" label="公司Logo" align="cent

Django PIL 直接從記憶體或資料庫blob顯示圖片

最近想實現一個圖片驗證的Python程式碼,被PIL卡住了。因為看了PIL的一些demo,就是沒有看到直接將image轉換成記憶體資料或可以直接print資料的,總不成我要將image先存成臨時檔案吧?這我可接受不了,我試了好長時間終於在limodou那裡的一篇文章找到了靈感

商品詳情頁 ,瀏覽歷史顯示圖片和詳細資訊,,,丟擲異常ERROR basehttp 124 "POST /admin/goods/sku/2/change/ HTTP/1.1" 500 19357

問題:商品詳情頁瀏覽歷史中不顯示圖片和詳細資訊丟擲異常django.template.exceptions.TemplateDoesNotExist: search/indexes/goods/sku_text.txtERROR basehttp 124 "POST /adm

jqGrid-表格顯示圖片

  colNames : [ 'alarmId', '事件分類', '事件子類', '事件級別','發生時間', '報警描述' ], colModel : [ {name : 'alarmId', index : 'alarmId',hidden : true },

小技巧,如何在Label顯示圖片

技術 body win images att 上下文 判斷 lsp 約束 這個需求其實是有的,比如QQ聊天界面裏面發送的信息,可以用label來顯示文字(也可以用button顯示),但是有時候用戶可能會發送圖片。如果能讓Label遇到文字就顯示文字,遇到圖片就顯示圖片就好了

thinkphp5.0查詢到的數據表的路徑是反斜杠導致無法正常顯示圖片怎麽辦?

url 顯示圖片 無法 log php pos ssi -1 str 添加到數據表中圖片的路徑有時會是反斜杠,這就導致了在url後面寫路徑的時候會識別不出來(不過src後面寫路徑就可以識別),所以就需要把路徑中的反斜杠替換成正斜杠,代碼如下: 1 $datu =

BASE64編碼的圖片在網頁顯示問題的解決

base64 問題 圖片 spi www. html nbsp base64編碼 href BASE64編碼的圖片在網頁中的顯示問題的解決 關於圖片的Base64編碼,你了解嗎? BASE64編碼的圖片在網頁中的顯示問題的解決

JS中將ajax請求返回json數據動態生成表格顯示在div

等待 query 客戶端 versions 包含 index 方法 func 數據 1、頁面內容 <div style="width:900px;height:400px;" id="tableInfo"></div> 2、js內容 $.aja

在c#使用bitblt顯示圖片

dso key order dex 性能 tco ret += windows 使用bitblt比DrawImage有更好的性能,實際使用中,毛邊現象比較嚴重。 1 2 3 4 5 6 7 8 9 10 11 12 13

opencv如何在jupyter notebook顯示圖片

pre book matplot clas AS AD color 必須 mat 方法一: from matplotlib import pyplot as plt import numpy as np import cv2 img = cv2.imread(‘img.

e557. 在Applet顯示圖片

init document pac base let ava ini ntb related See also e551 精簡的Applet. Image image; public void init() { // Load image

tp5匯入帶圖片的excel表格資料

控制器裡:  /**     * 訂單匯入(excel匯入)     */    public function import()    {      &nb

使用Layui實現資料表格滑鼠懸浮圖片放大效果,離開時恢復原圖

var tableIns = window.demoTable = table .render({ elem : '#idTest', id : 'idTest', url : '<%=path%>/

Python讀取,顯示,保存圖片的方法

from cool ont 讀取圖片 保存圖像 列表 href tail idt 一 opencv import cv2 as cv # load img = cv.imread(imagepath) # shape=(height, width, channel) h

layui table 顯示圖片

圖示: vm.layui.tableIns = table.render({ elem: '#layuiTable', url: baseURL + 'iotassert/iotassertsensortype/list', cellMinWidth: 95, p

富文字在TextView顯示圖片

最近在專案中有需求使用到了富文字,在android中我們設定TextView顯示富文字,如果不涉及圖片的話還是比較簡單的 TextView tv = new TextView(this); Spanned spanned = Html.fromHtml(content); tv.setT

MFCpicture控制元件顯示圖片

1.開啟BMP圖片 CBitmap* m_pBitmap = new CBitmap; m_pBitmap->LoadBitmap(IDB_BITMAP1);   2.第一種方式,用CDC顯示 CDC *pDC = GetDlgItem(IDC_AAAA)->Ge