Qt学习:项视图类之QListWidget

 QListWidget在其内部定义了一个具有列表结构的模型,并以列表形式显示其中的数据项。列表中的每个数据项被表示为类QListWidgetItem的一个对象。在列表视图中所要显示的数据被存放在每个数据项的角色DisplayRole对应的数据子项中。这个数据子项的类型为QVariant,其中可以存放类型为QString的字符串,也可以存放类型为int或者double的数值。我们可以调用QListWidget的成员函数addItem()

向列表添加一个数据项.

        在ListWidget控件的properties选项中,一般常对以下选项进行设置。

              name:            该控件对应源代码中的名称;

              font:            设置表格内部的字体;

              count:           保存项目的数目;

              currentRow:      保存当前项目的行;

              sortingEnabled:  是否对item排序。

        以下是一些常用的成员函数:

[cpp]  view plain  copy
  1. 1) QListWidget::QListWidget ( QWidget *parent = 0 )       // 构造一个父对象为parent的ListWidget。  
  2.   
  3. 2) void QListWidget::addItem ( const QString & label )     // 添加一个新的项目,在新添加的项目中添加label标签。  
  4.   
  5. 3) void QListWidget::addItem ( QListWidgetItem *item )   // 添加项目item。  
  6.   
  7. 4) void QListWidget::addItems ( const QStringList & labels )   // 添加一列项目。  
  8.   
  9. 5) void QListWidget::clear () [slot]   // 清除该ListWidget中的所有项目。  
  10.   
  11. 6) QListWidgetItem *QListWidget::currentItem () const    //返回当前活动项目。  
  12.   
  13. 7) void QListWidget::editItem ( QListWidgetItem *item )    //如果项目item是可编辑的,开始编辑项目item。  
  14.   
  15. 8) QList<QListWidgetItem *> QListWidget::findItems( constQString & text, QT::MatchFlags flags ) const  //查找匹配字符串text的项目,并返回查找结果。  
  16.   
  17. 9) void QListWidget::insertItem ( int row, QListWidgetItem *item )    //在行row处插入项目item。  
  18.   
  19. 10) void QListWidget::insertItem ( int row, const QString &label )        //这是一个重载函数,函数功能同9),在行row处插入标签为label的新项目。  
  20.   
  21. 11) voidQListWidget::insertItems ( int row, const QStringList & labels )    //在行row处插入一列项目。  
  22.   
  23. 12) QListWidgetItem *QListWidget::item ( int row ) const    //返回行row处的项目,如果行row处没有项目则返回0。  
  24.   
  25. 13) QListWidgetItem*QListWidget::itemAt ( const QPoint & p ) const    //返回点p处的项目。  
  26.   
  27. 14) QListWidgetItem *QListWidget::itemAt ( int x, int y ) const    //返回坐标(x,y)处的项目。  
  28.   
  29. 15) QWidget *QListWidget::itemWidget ( QListWidgetItem *item ) const    //返回项目item处显示的控件。  
  30.   
  31. 16) QListWidgetItem *QListWidget::takeItem ( int row )   // 移除行row处的项目,并返回项目控件。  
  32.   
  33. 17) void QListWidget::removeItemWidget ( QListWidgetItem *item )    //删除项目item处的控件。  
  34.   
  35. 18) int QListWidget::row ( const QListWidgetItem *item ) const    //返回项目item所在的行。  
  36.   
  37. 19) QList<QListWidgetItem *> QListWidget::selectedItems ()const    //返回所有被选中的项目的控件。  
  38.   
  39. 20) void QListWidget::setCurrentItem ( QListWidgetItem *item )    //设置项目item为当前项目。  
  40.   
  41. 21) void QListWidget::setItemWidget ( QListWidgetItem *item, QWidget*widget )    //设置控件widget为项目item的显示控件。  
  42.   
  43. 22) void QListWidget::setItemWidget ( QListWidgetItem *item, QWidget*widget )    //这是个重载函数,函数功能同23)。  
  44.   
  45. 23) voidQListWidget::sortItems ( QT::SortOrder order = QT::AscendingOrder )    //把项目按照order进行排序。  

下面给出一个例子,效果如下图:

 

        代码如下:

 

[cpp]  view plain  copy
  1. //flowchartsymbolpicker.h  
  2. #ifndef FLOWCHARTSYMBOLPICKER_H  
  3. #define FLOWCHARTSYMBOLPICKER_H  
  4.   
  5. #include <QDialog>  
  6. #include <QMap>  
  7. #include <QIcon>  
  8.   
  9. class QDialogButtonBox;  
  10. class QListWidget;  
  11.   
  12. class FlowChartSymbolPicker : public QDialog  
  13. {  
  14.     Q_OBJECT  
  15.       
  16. public:  
  17.     FlowChartSymbolPicker(const QMap<int, QString> &symbolMap,  
  18.                           QWidget *parent = 0);  
  19.   
  20.     int selectedId() const { return id; }  
  21.     void done(int result);  
  22.     ~FlowChartSymbolPicker();  
  23.   
  24. private slots:  
  25.     void message();  
  26.   
  27. private:  
  28.     QIcon iconForSymbol(const QString &symbolName);  
  29.   
  30.     QListWidget *listWidget;  
  31.     QDialogButtonBox *buttonBox;  
  32.     int id;  
  33. };  
  34.   
  35. #endif // FLOWCHARTSYMBOLPICKER_H  
  36.   
  37. //flowchartsymbolpicker.cpp  
  38. #include <QListWidget>  
  39. #include <QListWidgetItem>  
  40. #include <QDialogButtonBox>  
  41. #include <QVBoxLayout>  
  42. #include <QMessageBox>  
  43.   
  44. #include "flowchartsymbolpicker.h"  
  45.   
  46. FlowChartSymbolPicker::FlowChartSymbolPicker(const QMap<int, QString> &symbolMap,  
  47.                                              QWidget *parent)  
  48.     : QDialog(parent)  
  49. {  
  50.     id = -1;  
  51.   
  52.     listWidget = new QListWidget;  
  53.     listWidget->setIconSize(QSize(60,60));  
  54.     listWidget->setEditTriggers(QAbstractItemView::AnyKeyPressed);  
  55.   
  56.     QMapIterator<int, QString> i(symbolMap);  
  57.     while (i.hasNext()) {  
  58.         i.next();  
  59.         QListWidgetItem *item = new QListWidgetItem(i.value(), listWidget);  
  60.         item->setIcon(iconForSymbol(i.value()));  
  61.         item->setData(Qt::UserRole, i.key());  
  62.     }  
  63.   
  64.     buttonBox = new QDialogButtonBox(QDialogButtonBox::Ok |  
  65.                                      QDialogButtonBox::Cancel);  
  66.     connect(buttonBox, SIGNAL(accepted()), this, SLOT(message()));  
  67.     connect(buttonBox, SIGNAL(rejected()), this, SLOT(reject()));  
  68.   
  69.     QVBoxLayout *layout = new QVBoxLayout;  
  70.     layout->addWidget(listWidget);  
  71.     layout->addWidget(buttonBox);  
  72.     setLayout(layout);  
  73.   
  74.     setWindowTitle(tr("Flowchart Symbol Picker"));  
  75. }  
  76.   
  77. void FlowChartSymbolPicker::message()  
  78. {  
  79.     QMessageBox::about(this, tr("AHA"),tr("Thanks"));  
  80. }  
  81.   
  82. void FlowChartSymbolPicker::done(int result)  
  83. {  
  84.     id = -1;  
  85.     if (result == QDialog::Accepted) {  
  86.         QListWidgetItem *item = listWidget->currentItem();  
  87.         if (item)  
  88.             id = item->data(Qt::UserRole).toInt();  
  89.     }  
  90.     QDialog::done(result);  
  91. }  
  92.   
  93. QIcon FlowChartSymbolPicker::iconForSymbol(const QString &symbolName)  
  94. {  
  95.     QString fileName = ":/images/" + symbolName.toLower();  
  96.     fileName.replace(' ''_');  
  97.     return QIcon(fileName);  
  98. }  
  99.   
  100. FlowChartSymbolPicker::~FlowChartSymbolPicker()  
  101. {     
  102. }  
  103.   
  104. //main.cpp   
  105. #include "flowchartsymbolpicker.h"  
  106. #include <QApplication>  
  107.   
  108. int main(int argc, char *argv[])  
  109. {  
  110.     QApplication a(argc, argv);  
  111.   
  112.     QMap<int, QString> map;  
  113.     map.insert(77, QObject::tr("7"));  
  114.     map.insert(78, QObject::tr("11"));  
  115.     map.insert(79, QObject::tr("12"));  
  116.     map.insert(80, QObject::tr("13"));  
  117.     map.insert(81, QObject::tr("14"));  
  118.     map.insert(82, QObject::tr("15"));  
  119.     map.insert(83, QObject::tr("16"));  
  120.     map.insert(84, QObject::tr("ali5"));  
  121.     map.insert(85, QObject::tr("l5"));  
  122.     map.insert(86, QObject::tr("oh5"));  
  123.   
  124.     FlowChartSymbolPicker window(map);  
  125.     window.resize(300, 300);  
  126.     window.show();  
  127.       
  128.     return a.exec();  
  129. }  

 

        构造函数接收一个QMap关联容器对象,这个容器存储了每个项的ID和名字,在构造函数中我们遍历这个容器的每个元素,并用该元素的键和值设置QListWidgetItem对象的名字和ID。QListWidget有几个角色(role),每个角色都有一个关联的QVariant,最常用的角色有:Qt::DisplayRole, Qt::EditRole, Qt::IconRole, Qt::UserRole,并且这些角色都有方便的设置和获取函数[setText(), setIcon()]等。通过指定一个大于等于Qt::UsetRole的值就可以定义自定义的角色。在本例中,使用Qt::UserRole存储每一个项的ID。

        Done()函数式由QDialog重新实现的。当用户单击OK或者Cancel按钮时,就会调用它。如果用户单击OK,就获得相应的项,并且使用data()函数提取ID。如果对项的文本感兴趣,则可以通过调用item->data(Qt::DiaplayRole).toString()或者更为方便的item->text()来获取文本。

        默认情况下,QListWidget是只读的。如果想让用户编辑这些项,则可以使用QAbstractItemView:: setEditTriggers()设置这个视图的编辑触发器。例如:QAbstractItemView::AnyKeyPressed这个设置值的意思是:用户只要一开始输入就进入项的编辑状态。类似的,也可以提供一个Edit(编辑)按钮(还可以提供Add按钮和Delete按钮),同时使用信号槽连接,这样就可以使用程序来控制编辑操作了。

        我们还可以设置viewModel这个参数,来确定使用不同的视图进行显示。比如,我们使用下面的语句: 
 
        listWidget->setViewMode(QListView::IconMode);
        程序的效果如图:

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值