From Gossip@caterpillar

Qt3 Gossip: QCheckListItem 類別

QCheckListItem類別是QListViewItem的子類別,它可以顯示三種不同的Item,如下所示:
QCheckListItem::RadioButton
QCheckListItem::CheckBox
QCheckListItem::Controller

其中RadioButton的父節點必須是一個Controller,否則RadioButton的互斥效果就會失效。

下面這個程式綜合QListView、QListViewItem與QCheckListItem來展示,並示範如何在按下某個項目後,更換Item的資料夾圖示。

首先請編輯checklists.h:
  • checkists.h
#ifndef QCHECK_LIST
#define QCHECK_LIST

#include <qlistview.h>
#include <qpixmap.h>

class ListView : public QListView {
Q_OBJECT

public:
ListView();

protected:
QListViewItem *folder, *subfolder;
QPixmap close, open;
bool subfolderOn;

protected slots:
void clicked1(QListViewItem*);
void clicked2(QListViewItem*);
};

#endif


然後是checklists.cpp:
  • checklists.cpp
#include "checklists.h"
#include <qiconset.h>

ListView::ListView()
: close("folder.xpm"), open("folder_open.xpm") {
QCheckListItem *chklistitem1, *chklistitem2;

setCaption("QListView");
addColumn(QIconSet(close), "Folders");
addColumn("Type");
setColumnWidth(0, 230);

folder = new QListViewItem(this, " parent folder", "QListViewItem");
folder->setPixmap(0, open);
folder->setOpen(true);

subfolder = new QListViewItem(folder, " subfolder", "QListViewItem");
subfolder->setPixmap(0, close);
subfolderOn = false;

chklistitem1 = new QCheckListItem(folder,
"click me", QCheckListItem::CheckBox);
chklistitem1->setText(1, "Check Box");

chklistitem1 = new QCheckListItem(folder, "child");
chklistitem1->setText(1, "Controller");
chklistitem1->setOpen(true);

chklistitem2 = new QCheckListItem(chklistitem1,
"grand child 1", QCheckListItem::RadioButton);
chklistitem2->setText(1, "Radio Button");
chklistitem2 = new QCheckListItem(chklistitem1,
"grand child 2", QCheckListItem::RadioButton);
chklistitem2->setText(1, "Radio Button");

setTreeStepSize(30); // 與父節點的距離,default是20pixel
setSorting(0, false);
sort();

connect(this, SIGNAL(clicked(QListViewItem*)),
this, SLOT(clicked1(QListViewItem*)));
connect(this, SIGNAL(doubleClicked(QListViewItem*)),
this, SLOT(clicked2(QListViewItem*)));
}

void ListView::clicked1(QListViewItem *item) {
if(item == subfolder) {
subfolderOn = !subfolderOn;
item->setPixmap(0, subfolderOn ? open : close );
}
}

void ListView::clicked2(QListViewItem *item) {
if(item == folder)
item->setPixmap(0, item->isOpen() ? open : close);
}

最後是main.cpp:
  • main.cpp
#include "checklists.h"
#include <qapplication.h>

int main(int argc, char **argv) {
QApplication app(argc, argv);

ListView *piv = new ListView();
app.setMainWidget(piv);
piv->show();

return app.exec();
}


基本上這個程式在邏輯與配置上並不難,主要在於判斷發生Signals時,是哪一個Item發出的就可以了,這使用if(item == subfolder)或if(item == folder)來判斷。

以下是程式的執行結果畫面: