• QListWidget
  • QTreeWidget
  • QTableWidget

item widgets 是基于item的,是把控件直接使用addWidget(xxx)加进去的

一. QTableWidget

自动调整表格的行高和列宽:

  • resizeColumnsToContents(): 自动调整所有列的宽度
  • resizeColumnToContents(int column): 自动调整列号为column的宽度
  • resizeRowsToContents(): 自动调整所有行的高度
  • resizeRowToContents(int row): 自动调整行号为row的高度

1. 设置表头

  1. QTableWidgetItem *headerItem;
  2. QStringList headerList;
  3. headerList << "姓 名" << "性 别" << "出生日期" << "民 族" << "分 数" << "是否党员";
  4. ui->tableWidget->setColumnCount(headerList.count());
  5. for (int i=0; i<ui->tableWidget->columnCount(); i++) {
  6. headerItem = new QTableWidgetItem(headerList.at(i));
  7. QFont font = ui->tableWidget->font();
  8. font.setBold(true);
  9. font.setPointSize(12);
  10. headerItem->setFont(font);
  11. headerItem->setTextColor(Qt::red);
  12. ui->tableWidget->setHorizontalHeaderItem(i, headerItem);
  13. }

2. 添加一行

  1. // 自定义单元格Type的类型,在创建单元格的item时使用
  2. enum CellType {ctName=10001, ctSex, ctBirth, ctNation, ctScore, ctPartyM};
  3. // 各字段在表格中的列号
  4. enum FieldColNum {colName=0, colSex, colBirth, colNation, colScore, colPartyM};
  1. QTableWidgetItem *item;
  2. // name
  3. item = new QTableWidgetItem(name, ctName);
  4. item->setTextAlignment(Qt::AlignHCenter|Qt::AlignVCenter);
  5. item->setData(Qt::UserRole, StudID++);
  6. ui->tableWidget->setItem(rowNo, colName, item);
  7. // sex
  8. item = new QTableWidgetItem(sex, ctSex);
  9. QIcon icon;
  10. if (sex == "男")
  11. icon.addFile(":/images/images/Male-1.png");
  12. else
  13. icon.addFile(":/images/images/female.png");
  14. item->setIcon(icon);
  15. item->setTextAlignment(Qt::AlignHCenter|Qt::AlignVCenter);
  16. ui->tableWidget->setItem(rowNo, colSex, item);
  17. // birth
  18. item = new QTableWidgetItem(birth.toString("yyyy-MM-dd"), ctBirth);
  19. item->setTextAlignment(Qt::AlignHCenter|Qt::AlignVCenter);
  20. ui->tableWidget->setItem(rowNo, colBirth, item);
  21. // nation
  22. item = new QTableWidgetItem(nation, ctNation);
  23. item->setTextAlignment(Qt::AlignHCenter|Qt::AlignVCenter);
  24. ui->tableWidget->setItem(rowNo, colNation, item);
  25. // score
  26. item = new QTableWidgetItem(QString::number(score), ctScore);
  27. item->setTextAlignment(Qt::AlignHCenter|Qt::AlignVCenter);
  28. ui->tableWidget->setItem(rowNo, colScore, item);
  29. // party
  30. item = new QTableWidgetItem("党员", ctPartyM);
  31. if (isPM)
  32. item->setCheckState(Qt::Checked);
  33. else
  34. item->setCheckState(Qt::Unchecked);
  35. item->setTextAlignment(Qt::AlignHCenter|Qt::AlignVCenter);
  36. item->setBackgroundColor(Qt::yellow);
  37. item->setTextColor(Qt::black);
  38. ui->tableWidget->setItem(rowNo, colPartyM, item);

3. 设置表头是否显示

  1. ui->tableWidget->horizontalHeader()->setVisible(true/false);
  2. ui->tableWidget->verticalHeader()->setVisible(true/false);

4. 设置选择方式

  1. ui->tableWidget->setSelectionBehavior(QAbstractItemView::SelectRows); // 行选
  2. ui->tableWidget->setSelectionBehavior(QAbstractItemView::SelectItems); //单元格选

二. QDockWidget

  • 可以停靠的控件。
  • 它是一个容器,把其它的控件放在里面就好

三. QTreeWidget

  • 获取被选中的 item:
  1. QTreeWidgetItem *cItem = ui->treeWidget->currentItem();
  • 获取最顶级的 item:
  1. QTreeWidgetItem *topItem = ui->treeWidget->topLevelItem(ui->treeWidget->topLevelItemCount()-1);
  • 获取父级节点:
  1. QTreeWidgetItem *cItem = ui->treeWidget->currentItem();
  2. QTreeWidgetItem *parItem = parItem = cItem->parent();
  • 动态添加 item:
  1. // 目录树列的编号定义
  2. enum treeItemType{itTopItem=1001,itGroupItem,itImageItem};
  3. enum treeColNum{colItem=0, colItemType=1}; // 枚举类型,表示列号
  4. // 每个行节点都有两列
  5. QTreeWidgetItem *item = new QTreeWidgetItem(itImageItem);
  6. QIcon icon(":/images/images/pic.png");
  7. item->setIcon(colItem, icon);
  8. item->setText(colItem, fileName);
  9. item->setText(colItemType, "type:image");
  10. item->setFlags(Qt::ItemIsSelectable|Qt::ItemIsAutoTristate
  11. |Qt::ItemIsEnabled|Qt::ItemIsUserCheckable);
  12. item->setCheckState(colItem, Qt::Checked);
  13. item->setData(colItem, Qt::UserRole, file);
  14. parItem->addChild(item);

四. QListWidget

  • 动态插入 item:
  1. QIcon icon(":/images/images/point.png");
  2. QListWidgetItem *item = new QListWidgetItem("Item X");
  3. item->setIcon(icon);
  4. item->setFlags(Qt::ItemIsSelectable
  5. |Qt::ItemIsUserCheckable|Qt::ItemIsEnabled);
  6. ui->listWidget->insertItem(ui->listWidget->currentRow(), item);
  7. // 或者 添加
  8. // ui->listWidget->addItem(item);
  • 动态调整 listWidget 高度:
  1. for (int i=0; i<mAttachFilePath.count(); i++) {
  2. QListWidgetItem *item = new QListWidgetItem(mAttachFilePath[i]);
  3. item->setFlags(Qt::ItemIsSelectable |
  4. Qt::ItemIsEnabled);
  5. ui->listWidgetAttachment->addItem(item);
  6. }
  7. ui->listWidgetAttachment->setFixedHeight(
  8. ui->listWidgetAttachment->sizeHintForRow(0) *
  9. ui->listWidgetAttachment->count() +
  10. 2 * ui->listWidgetAttachment->frameWidth()
  11. );
  • 右键菜单:
  1. 默认情况下是出不来的,需要在 Designer 中设置: contextMenuPolicy: CustomContextMenu
  2. 实现SLOT: customContextMenuRequested:
  1. QMenu *menuList = new QMenu(this); // 创建菜单
  2. // 添加Actions创建菜单项
  3. menuList->addAction(ui->actListIni);
  4. menuList->addAction(ui->actListClear);
  5. menuList->addAction(ui->actListInsert);
  6. menuList->addAction(ui->actListAppend);
  7. menuList->addAction(ui->actListDel);
  8. menuList->addSeparator();
  9. menuList->addAction(ui->actSelAll);
  10. menuList->addAction(ui->actSelNone);
  11. menuList->addAction(ui->actSelInvs);
  12. menuList->exec(QCursor::pos()); // 在鼠标光标位置显示右键菜单
  13. delete menuList; // 手工创建的指针必须手工删除