QTableView & QTableWidget
QTableWidget是QTableView的子类;主要的区别是:
QTableView可以使用自定义的数据模型来显示内容,先要通过setModel来绑定数据源;
QTableWidget则只能使用标准的数据模型,不需要数据源,将逐个单元格内的信息填好即可。
list,Tree同理。
QTableWidget:
QTableWidget tableWidget;
tableWidget.setColumnCount(3);
tableWidget.setRowCount(5);
QStringList headers;
headers << "ID" << "Name" << "Age";
tableWidget.setHorizontalHeaderLabels(headers);
tableWidget.setItem(0, 0, new QTableWidgetItem(QString("0001")));
tableWidget.setItem(1, 0, new QTableWidgetItem(QString("0002")));
tableWidget.setItem(2, 0, new QTableWidgetItem(QString("0003")));
tableWidget.setItem(3, 0, new QTableWidgetItem(QString("0004")));
tableWidget.setItem(4, 0, new QTableWidgetItem(QString("0005")));
tableWidget.setItem(0, 1, new QTableWidgetItem(QString("20100112")));
tableWidget.show();
建立了一个5*3的表格,并填充了一些数据。
QTreeWidget
QTreeWidget treeWidget;
QStringList headers;
headers << "Name" << "Number";
treeWidget.setHeaderLabels(headers);
QStringList rootTextList;
rootTextList << "Root" << "0";
QTreeWidgetItem *root = new QTreeWidgetItem(&treeWidget, rootTextList);
new QTreeWidgetItem(root, QStringList() << QString("Leaf 1") << "1");
QTreeWidgetItem *leaf2 = new QTreeWidgetItem(root,
QStringList() << QString("Leaf 2") << "2");
leaf2->setCheckState(0, Qt::Checked);
QList<QTreeWidgetItem *> rootList;
rootList << root;
treeWidget.insertTopLevelItems(0, rootList);
treeWidget.show();
setHeaderLabels(),用来设置header。
QList<> 是一个列表模板类。
QTreeWidgetItem()有多种重载形式。
QListWidget
label = new QLabel(this);
label->setFixedWidth(70);
listWidget = new QListWidget(this);
//添加item
new QListWidgetItem(QIcon(QPixmap("../images/1207021.png")), tr("21"), listWidget);
new QListWidgetItem(QIcon(QPixmap("../images/1207022.png")), tr("Firefox"), listWidget);
listWidget->addItem(new QListWidgetItem(QIcon(QPixmap("../images/1207023.png")), tr("IE")));
listWidget->addItem(new QListWidgetItem(QIcon(QPixmap("../images/1207024.png")), tr("Netscape")));
listWidget->addItem(new QListWidgetItem(QIcon(QPixmap("../images/1207025.png")), tr("Opera")));
listWidget->addItem(new QListWidgetItem(QIcon(QPixmap("../images/1207026.png")), tr("Safari")));
listWidget->addItem(new QListWidgetItem(QIcon(QPixmap("../images/1207031.png")), tr("TheWorld")));
listWidget->addItem(new QListWidgetItem(QIcon(QPixmap("../images/1207035.png")), tr("Traveler")));
QListWidgetItem *newItem = new QListWidgetItem;
newItem->setIcon(QIcon(QPixmap("../images/1207029.png")));
newItem->setText(tr("Maxthon"));
listWidget->insertItem(3, newItem);
listWidget->setViewMode(QListView::IconMode);
QHBoxLayout *layout = new QHBoxLayout;
//添加widget
layout->addWidget(label);
layout->addWidget(listWidget);
setLayout(layout);
connect(listWidget, SIGNAL(currentTextChanged(QString)),
label, SLOT(setText(QString)));
下午在做老师给的demo
进度是:
实现了双击则在该行该列出现按钮。
遇见问题:
一开始打算用鼠标双击事件做该功能,自己写了一个
void mouseDoubleClickEvent(QMouseEvent *)
,但QTableWidget 不响应该事件。
之后想用信号槽机制。恰好QTableWidget 的signals 里面有
void cellDoubleClicked(int row, int column)
,就自定义实现了一个槽函数DoubleClick()。
QObject::connect(tableWidget,SIGNAL(cellDoubleClicked(int,int)),this,SLOT(DoubleClick()));