一、列表控件的使用方法(QListWidget)

QListWidget

负责以列表的形式显示数据

其中的数据项称为item,每个item至少包含

1、图标icon(可选)

2、文本text

3、关联数据data(可选)


有点像Combox


界面:



添加项:

QListWidgetItem:代表一个数据项

QIconicon1("./MyIcon.png");ui.ListWidget->addItem(newQListWidgetItem(icon1,"book"));

在构造函数里直接指定icon, text, 此对象由父窗口负责管理,我们在使用时也不需要考虑内存的回收问题。




移除项:

可以从列表中将一个数据项移除

//事先用currentRow()方法获取所选择的下标QListWidgetItem*takeItem(introw);

调用该方法,数据项将被移出列表,返回一个对象,该对象必须手动释放

(当然,这个对象也可以继续使用在别的用途)


该对象必须手工删除!

该对象必须手工删除!

该对象必须手工删除!


该对象必须手工删除



效果:


代码:


classTest12_1a_12_13:publicQMainWindow{Q_OBJECTpublic:Test12_1a_12_13(QWidget*parent=Q_NULLPTR);private:Ui::Test12_1a_12_13Classui;privateslots:intOnBtnRemeve();intOnBtnSwitchView();};///////////////////////////Test12_1a_12_13::Test12_1a_12_13(QWidget*parent):QMainWindow(parent){ui.setupUi(this);//添加数据项QIconicon1("./Resources/Book.png");ui.listWidget->addItem(newQListWidgetItem(icon1,"book"));QIconicon2("./Resources/Heart.png");ui.listWidget->addItem(newQListWidgetItem(icon2,"Heart"));QIconicon3("./Resources/Location.png");ui.listWidget->addItem(newQListWidgetItem(icon3,"Location"));assert(connect(ui.btnRemove,SIGNAL(clicked(bool)),this,SLOT(OnBtnRemeve())));assert(connect(ui.btnSwitchView,SIGNAL(clicked(bool)),this,SLOT(OnBtnSwitchView())));}//删除按钮intTest12_1a_12_13::OnBtnRemeve(){//当前的选中项(行号)introw=ui.listWidget->currentRow();QListWidgetItem*item=ui.listWidget->takeItem(row);//手动释放内存if(item){deleteitem;}return0;}//切换视图按钮(图标方式(平铺)、列表)//图标方式:QListView::IconMode//列表方式:QListView::ListModeintTest12_1a_12_13::OnBtnSwitchView(){if(ui.listWidget->viewMode()==QListView::ListMode){ui.listWidget->setViewMode(QListView::IconMode);}else{ui.listWidget->setViewMode(QListView::ListMode);}return0;}



信号:

常用的信号:单击和双击事件

voiditemClicked(QListWidgetItem*item);voiditemDoubleClicked(QListWidgetItem*item);


data:

每一项事件都可以关联很多个data,每个data都有一个id(role),每个role对应一个值(value)

(有点类似STL里面的 key value )

Qt::UserRole(32)以上都是自定义的role,32以下用于显示已经规定好的role

(role 和 value 有点类似 K V的关系, 是一一对应的)




二、Model/View构架

Model/View构架(简单介绍)

在Qt里,将List,Tree,Table这三种控件统一按照Model/View构架进行设计。


它们的使用方法都是类似的。


Model:

负责管理数据项,统一安排二维表格数据进行管理。

每一行称为row

每一行内有多个列column

每一项称为item,每一项的坐标称为QModelIndex

(列表控件列数为1)


item:

数据项,每个单元格都是一个item,每个item可以关联多个数据,每个数据用一个role来作为表示。

Qt::DisplayRole(0);//一般对应一个字符串,用于显示Qt::UserRole(32);//自定义数据



View : 负责显示;



三、自定义显示


四、原位编辑

Test12_4a_12_15::Test12_4a_12_15(QWidget*parent):QMainWindow(parent){ui.setupUi(this);Additem("book");Additem("heart");ui.listWidget->setItemDelegate(newMyDelegate(ui.listWidget));}voidTest12_4a_12_15::Additem(QStringname){QListWidgetItem*item=newQListWidgetItem();item->setData(Qt::DisplayRole,name);item->setFlags(Qt::ItemIsEnabled|Qt::ItemIsEditable);//注意加上!ui.listWidget->addItem(item);}//第一步:创建一个widget作为编辑器QWidget*MyDelegate::createEditor(QWidget*parent,constQStyleOptionViewItem&option,constQModelIndex&index)const{QLineEdit*editor=newQLineEdit(parent);returneditor;}//第二步:调用编辑器的显示位置voidMyDelegate::updateEditorGeometry(QWidget*editor,constQStyleOptionViewItem&option,constQModelIndex&index)const{editor->setGeometry(option.rect);}//第三步:初始化显示数据voidMyDelegate::setEditorData(QWidget*editor,constQModelIndex&index)const{QStringtext=index.data(Qt::DisplayRole).toString();QLineEdit*ed=(QLineEdit*)editor;ed->setText(text);//((QLineEdit*)editor)->setText(text);}//第四步:用户完成编辑、或编辑器被关闭时,提供数据到modelvoidMyDelegate::setModelData(QWidget*editor,QAbstractItemModel*model,constQModelIndex&index)const{QLineEdit*lineEdit=(QLineEdit*)editor;QStringvalue=lineEdit->text();model->setData(index,value,Qt::DisplayRole);}



五、列表控件——右键菜单


任务:

给QListWidget添加右键支持,点击右键的时候,弹出快捷菜单(又称上下文菜单)


步骤:

1、设置菜单策略 setContextMenuPolicy( Qt::CustomContextMenu );

2、关联信号 customContextMenuRequested()

3、事件处理(slot):构造菜单、显示

4、菜单响应(action)


菜单的构造:

QMenumenu;//这些action事先在QtDesign中的ActionEditor中添加menu.addAction(ui.actionAdd);menu.addAction(ui.actionRemove);


菜单的显示:

//显示菜单menu.exec(ui.listWidget->mapToGlobal(pt));

要把这个QPoint转换成全局坐标(屏幕坐标)


菜单的上下文:

在构造快捷菜单时,应该根据鼠标点击的位置(上下文)来定制不同的菜单

比如,当鼠标点中了一个现有项,则显示“添加、删除”菜单,

而如果点中的是空白,则弹出菜单中,不应该有“删除”按钮




六、树控件 与 表格控件


树控件(QTreeWidget):

树控件用于显示“树”形的数据,例如文件树。

每一项可以用多个列(Column),每一列表示该项的一个属性

可以在Qt Designer中插入节点,也可以在代码中手动插入节点


表格(QTableWidget)

表格控件用于显示“表格”状的数据,成行、列显示,

每个单元格是独立的


补充:这里介绍的QTreeWidget 和 QTableWidget都是可以实现之前介绍的:

自定义显示、原位编辑、右键菜单、事件处理的,

实现方式均为 Delegate