2012-03-07 116 views
0

我在QListWidget中有一個QListWidgetItem的列表(由於數量巨大,Hor滾動條在那裏)。每個QListWidgetItem都包含一個QPixmap作爲數據(縮小到某個隨機值)。我的要求是當點擊一個QPixmap時應該突出顯示(刷寬爲10的四捨五入)。我將每個QListWidgetItem委託給一個QItemDelegate。我在這裏有幾個問題。在QListWidget的QPixmap上繪畫

  1. 如何在選擇相應的QListWidgetItem時繪製QPixmap的圓角矩形?

  2. 當點擊QPixmap(不在QListWidgetItem的其他部分)時,上述繪製事件應該會發生。由於QPixmaps大小不同,QListWidgetItem中的QPixmaps的頂部和底部部分將爲空,並且單擊此處也會觸發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中做了這樣的事情。在Delegate :: paint()方法中將修改後的Qpixmap繪製到listItem中時,我們需要給出繪製QPixmap的座標。我的問題是如何找到這些座標,因爲我的QPixmap是居中對齊的。 option.rect()。x()和y()給出項目的左上角座標值。有沒有辦法讓繪畫中心對齊?還是我們需要手動計算? – 2012-03-08 07:03:30

+0

我很難弄清楚你在做什麼:-)也許你可以更具體地說明你在用QPixmap做什麼以及爲什麼你需要座標。 – 2012-03-08 10:52:10

+0

讓我告訴我的實際問題。在每個listItem中我有一個QPixmap。每個QPixmap的大小都是可變的。如果我點擊listItem,相應的圖片應該以這樣的方式突出顯示,即必須圍繞該圖片繪製圓角矩形。 因此,在委託繪畫方法中,我獲取數據(QPixmap)並在其周圍繪製圓角矩形。然後我想在中心對齊的ListWidgetItem上繪製更新後的QPixmap。爲了繪製QPixmap,我們需要指定QRect。無論如何,我們可以手動計算中心對齊的幾何圖形,但我想知道是否有更好的方法 – 2012-03-08 13:50:59