- QListWidget
- QTreeWidget
- QTableWidget
item widgets 是基于item
的,是把控件直接使用addWidget(xxx)
加进去的
一. QTableWidget
自动调整表格的行高和列宽:
resizeColumnsToContents()
: 自动调整所有列的宽度resizeColumnToContents(int column)
: 自动调整列号为column的宽度resizeRowsToContents()
: 自动调整所有行的高度resizeRowToContents(int row)
: 自动调整行号为row的高度
1. 设置表头
QTableWidgetItem *headerItem;
QStringList headerList;
headerList << "姓 名" << "性 别" << "出生日期" << "民 族" << "分 数" << "是否党员";
ui->tableWidget->setColumnCount(headerList.count());
for (int i=0; i<ui->tableWidget->columnCount(); i++) {
headerItem = new QTableWidgetItem(headerList.at(i));
QFont font = ui->tableWidget->font();
font.setBold(true);
font.setPointSize(12);
headerItem->setFont(font);
headerItem->setTextColor(Qt::red);
ui->tableWidget->setHorizontalHeaderItem(i, headerItem);
}
2. 添加一行
// 自定义单元格Type的类型,在创建单元格的item时使用
enum CellType {ctName=10001, ctSex, ctBirth, ctNation, ctScore, ctPartyM};
// 各字段在表格中的列号
enum FieldColNum {colName=0, colSex, colBirth, colNation, colScore, colPartyM};
QTableWidgetItem *item;
// name
item = new QTableWidgetItem(name, ctName);
item->setTextAlignment(Qt::AlignHCenter|Qt::AlignVCenter);
item->setData(Qt::UserRole, StudID++);
ui->tableWidget->setItem(rowNo, colName, item);
// sex
item = new QTableWidgetItem(sex, ctSex);
QIcon icon;
if (sex == "男")
icon.addFile(":/images/images/Male-1.png");
else
icon.addFile(":/images/images/female.png");
item->setIcon(icon);
item->setTextAlignment(Qt::AlignHCenter|Qt::AlignVCenter);
ui->tableWidget->setItem(rowNo, colSex, item);
// birth
item = new QTableWidgetItem(birth.toString("yyyy-MM-dd"), ctBirth);
item->setTextAlignment(Qt::AlignHCenter|Qt::AlignVCenter);
ui->tableWidget->setItem(rowNo, colBirth, item);
// nation
item = new QTableWidgetItem(nation, ctNation);
item->setTextAlignment(Qt::AlignHCenter|Qt::AlignVCenter);
ui->tableWidget->setItem(rowNo, colNation, item);
// score
item = new QTableWidgetItem(QString::number(score), ctScore);
item->setTextAlignment(Qt::AlignHCenter|Qt::AlignVCenter);
ui->tableWidget->setItem(rowNo, colScore, item);
// party
item = new QTableWidgetItem("党员", ctPartyM);
if (isPM)
item->setCheckState(Qt::Checked);
else
item->setCheckState(Qt::Unchecked);
item->setTextAlignment(Qt::AlignHCenter|Qt::AlignVCenter);
item->setBackgroundColor(Qt::yellow);
item->setTextColor(Qt::black);
ui->tableWidget->setItem(rowNo, colPartyM, item);
3. 设置表头是否显示
ui->tableWidget->horizontalHeader()->setVisible(true/false);
ui->tableWidget->verticalHeader()->setVisible(true/false);
4. 设置选择方式
ui->tableWidget->setSelectionBehavior(QAbstractItemView::SelectRows); // 行选
ui->tableWidget->setSelectionBehavior(QAbstractItemView::SelectItems); //单元格选
二. QDockWidget
- 可以停靠的控件。
- 它是一个容器,把其它的控件放在里面就好
三. QTreeWidget
- 获取被选中的 item:
QTreeWidgetItem *cItem = ui->treeWidget->currentItem();
- 获取最顶级的 item:
QTreeWidgetItem *topItem = ui->treeWidget->topLevelItem(ui->treeWidget->topLevelItemCount()-1);
- 获取父级节点:
QTreeWidgetItem *cItem = ui->treeWidget->currentItem();
QTreeWidgetItem *parItem = parItem = cItem->parent();
- 动态添加 item:
// 目录树列的编号定义
enum treeItemType{itTopItem=1001,itGroupItem,itImageItem};
enum treeColNum{colItem=0, colItemType=1}; // 枚举类型,表示列号
// 每个行节点都有两列
QTreeWidgetItem *item = new QTreeWidgetItem(itImageItem);
QIcon icon(":/images/images/pic.png");
item->setIcon(colItem, icon);
item->setText(colItem, fileName);
item->setText(colItemType, "type:image");
item->setFlags(Qt::ItemIsSelectable|Qt::ItemIsAutoTristate
|Qt::ItemIsEnabled|Qt::ItemIsUserCheckable);
item->setCheckState(colItem, Qt::Checked);
item->setData(colItem, Qt::UserRole, file);
parItem->addChild(item);
四. QListWidget
- 动态插入 item:
QIcon icon(":/images/images/point.png");
QListWidgetItem *item = new QListWidgetItem("Item X");
item->setIcon(icon);
item->setFlags(Qt::ItemIsSelectable
|Qt::ItemIsUserCheckable|Qt::ItemIsEnabled);
ui->listWidget->insertItem(ui->listWidget->currentRow(), item);
// 或者 添加
// ui->listWidget->addItem(item);
- 动态调整 listWidget 高度:
for (int i=0; i<mAttachFilePath.count(); i++) {
QListWidgetItem *item = new QListWidgetItem(mAttachFilePath[i]);
item->setFlags(Qt::ItemIsSelectable |
Qt::ItemIsEnabled);
ui->listWidgetAttachment->addItem(item);
}
ui->listWidgetAttachment->setFixedHeight(
ui->listWidgetAttachment->sizeHintForRow(0) *
ui->listWidgetAttachment->count() +
2 * ui->listWidgetAttachment->frameWidth()
);
- 右键菜单:
- 默认情况下是出不来的,需要在 Designer 中设置:
contextMenuPolicy: CustomContextMenu
- 实现SLOT:
customContextMenuRequested
:
QMenu *menuList = new QMenu(this); // 创建菜单
// 添加Actions创建菜单项
menuList->addAction(ui->actListIni);
menuList->addAction(ui->actListClear);
menuList->addAction(ui->actListInsert);
menuList->addAction(ui->actListAppend);
menuList->addAction(ui->actListDel);
menuList->addSeparator();
menuList->addAction(ui->actSelAll);
menuList->addAction(ui->actSelNone);
menuList->addAction(ui->actSelInvs);
menuList->exec(QCursor::pos()); // 在鼠标光标位置显示右键菜单
delete menuList; // 手工创建的指针必须手工删除