Qt有自己的MVC框架,分别是model(模型)、view(视图)、delegate(委托),这篇文章,简单的介绍以下Qt中有关view(视图)的类以及一些基本的使用。
Qt官方的文档已经很详细了,如果想要详细的去了解,不如花点精力去看官方文档。
由于View的类,有很多的属性以及基本的信号,所以先介绍一下QAbstractItemView的一些属性,以及属性呈现的效果。
alternatingRowColors
ui->tableView->setAlternatingRowColors(true);
通过样式表来修改交替的颜色:
QTableView::item:!alternate{
background-color: green;
}
QTableView::item:alternate{
background-color: blue;
}
autoScorll
这个属性的作用是设置当拖动表格内部内容时,会不会自动滚动。
例如:
ui->listView->setAutoScroll(false);
// 设置成不自动滚动
autoScorllMargin
This property controls the size of the area at the edge of the viewport that triggers autoscrolling.
此属性控制viewport边缘触发自动滚动的区域的大小
defaultDropAction
当拖拽表格内的一个项的时候,松开鼠标时,所出现的默认动作。如果不进行设置,默认是一个CopyAction。
例如:
首先设置表格可以拖拽
// 设置表格可拖拽
ui->listView->setDragEnabled(true);
ui->listView->setDragDropMode(QAbstractItemView::DragDrop);
dragDropMode
dragDropOverwriteMode
如果其值为 true,则所选数据在drop时将覆盖现有项目数据,而移动数据将清除该项目。如果其值为 false,则在drop数据时,所选数据将作为新项插入。移动数据时,也会删除该项。
dragEnable
其值为true时,则允许拖拽。
editTriggers
这个属性保存了view的编辑触发方式。
例如:
QListView在默认情况下,编辑触发方式为双击以及编辑按钮:QFlagsQAbstractItemView::EditTrigger(DoubleClicked|EditKeyPressed)
下面我们把这个属性修改一下,改成SelectedClicked
ui->listView->setEditTriggers(QAbstractItemView::SelectedClicked);
horizontalScrollMode
此属性控制视图如何水平滚动其内容
iconSize
此属性控制item的图标大小
首先,我们需要给添加的item设置icon
model->item(0, 0)->setIcon(QIcon("D:/gaobo/BrowserDownload/text.png"));
ui->tableView->setIconSize(QSize(64, 64));
本人测试的结果是,iconSize最大也只能是图片的大小。向上图的例子,即使你把iconSize设置成QSize(128, 128),icon的大小还是64*64。
selectionBehavior
此属性保存选择的行为。
例如:
正常情况下,行、列、单个项都可以选中
设置为只选择行后:
ui->tableView->setSelectionBehavior(QAbstractItemView::SelectRows);
selectionMode
showDropIndicator
ui->tableView->setDropIndicatorShown(false);
tabKeyNavigation
此属性设置是否启动tab和backtab键
textElideMode
此属性保存省略文本中“…”的位置
在往QColumnView里添加数据后,呈现的效果为:
QStandardItemModel* columnModel = new QStandardItemModel;
QStandardItem* item_1 = new QStandardItem("1");
QStandardItem* item_1_1 = new QStandardItem("1-1");
QStandardItem* item_1_2 = new QStandardItem("1-2");
QStandardItem* item_1_3 = new QStandardItem("1-3");
QStandardItem* item_2 = new QStandardItem("2");
QStandardItem* item_2_1 = new QStandardItem("2-1");
QStandardItem* item_2_1_1 = new QStandardItem("2-1-1");
QStandardItem* item_2_1_2 = new QStandardItem("2-1-2");
QStandardItem* item_2_1_3 = new QStandardItem("2-1-3");
item_2_1->appendRows({item_2_1_1, item_2_1_2, item_2_1_3});
QStandardItem* item_2_2 = new QStandardItem("2-2");
QStandardItem* item_2_2_1 = new QStandardItem("2-2-1");
QStandardItem* item_2_2_2 = new QStandardItem("2-2-2");
QStandardItem* item_2_2_3 = new QStandardItem("2-2-1");
item_2_2->appendRows({item_2_2_1, item_2_2_2, item_2_2_3});
QStandardItem* item_2_3 = new QStandardItem("2-3");
QStandardItem* item_2_3_1 = new QStandardItem("2-3-1");
QStandardItem* item_2_3_2 = new QStandardItem("2-3-2");
QStandardItem* item_2_3_3 = new QStandardItem("2-3-3");
item_2_3->appendRows({item_2_3_1, item_2_3_2, item_2_3_3});
item_1->appendRows({item_1_1, item_1_2, item_1_3});
item_2->appendRows({item_2_1, item_2_2, item_2_3});
columnModel->appendRow(item_1);
columnModel->appendRow(item_2);
ui->columnView->setModel(columnModel);
resizeGripsVisible
此属性用于指定列表视图是否获得调整大小的控制
调用setResizeGripVisible来设置这个属性。
ui->columnView->setResizeGripsVisible(false);
最基础的QListView使用方式如下:
QStringListModel *m_listModel = new QStringListModel;
QStringList list = {"EEEEEEEEEEEEEEE EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE",
"AAA", "CCC", "BBB", "DDD","111", "222", "333", "444",
"555", "a.jpg", "b.jpg"};
m_listModel->setStringList(list);
ui->listView->setModel(m_listModel);
ui->listView->show();
batchSize
This property holds the number of items laid out in each batch if layoutMode is set to Batched
如果布局Mode设置为“批处理”,则此属性保存每个批次中布局的项目数
flow
此属性设置QListView中的项排布方向。默认情况下,是TopToButtom。在view可见时设置此属性将导致item再次排列。
修改方向之后:
gridSize
此属性设置布局时的栅格大小。
配合isWrapping、flow属性一起使用后:
ui->listView->setFlow(QListView::LeftToRight);
ui->listView->setGridSize(QSize(40, 40));
ui->listView->setWrapping(true);
isWrapping
ui->listView->setWrapping(true);
itemAlignment
此属性控制item的位置。只有在当前模式为ListModel以及isWarpping这个属性为true时,才会有效果。
ui->listView->setWrapping(true);
ui->listView->setItemAlignment(Qt::AlignRight);
layoutMode
This property holds the layout mode for the items. When the mode is SinglePass (the default), the items are laid out all in one go. When the mode is Batched, the items are laid out in batches of batchSize items, while processing events. This makes it possible to instantly view and interact with the visible items while the rest are being laid out.
此属性保存项的布局模式。当模式为 SinglePass(默认值)时,将一次性布置所有项目。当模式为“批处理”时,在处理事件时,将按批次的批次大小项目进行布局。这样就可以在布置其余项目时立即查看可见项目并与之交互。
modelColumn
此属性保存模型中可见的列。也就是说,如果有一个多列的model,设置这个modelColumn来设置显示哪一列。默认是显示第一列。
QStandardItemModel *model = new QStandardItemModel();
model->setItem(0, 0, new QStandardItem(""));
model->setItem(1, 0, new QStandardItem(""));
model->setItem(2, 0, new QStandardItem(""));
model->item(0, 0)->setIcon(QIcon("D:/gaobo/BrowserDownload/text.png"));
model->setItem(0, 1, new QStandardItem("11"));
model->setItem(1, 1, new QStandardItem("22"));
model->setItem(2, 1, new QStandardItem("50"));
model->setItem(0, 2, new QStandardItem("1"));
model->setItem(1, 2, new QStandardItem("2"));
model->setItem(2, 2, new QStandardItem("3"));
ui->listView->setModel(model);
ui->listView->setModelColumn(1);
movement
resizeMode
此属性设置当view重新调整大小时,item需不需要重新布局。
selectionRectVisible
此属性设置是否显示区域选中的矩形框,默认是不显示。
设置显示之后
ui->listView->setSelectionRectVisible(true);
spacing
ui->listView->setSpacing(10);
uniformItemSizes
此属性设置是否所有的item都是同一个大小
设置为true之后:
ui->listView->setUniformItemSizes(true);
viewMode
wordWrap
ui->listView->setWordWrap(true);
至此,QListView的属性就介绍完了。
最基础的QTableView使用方式如下:
QStandardItemModel *model = new QStandardItemModel();
model->setItem(0, 0, new QStandardItem(""));
model->setItem(1, 0, new QStandardItem(""));
model->setItem(2, 0, new QStandardItem(""));
model->setItem(0, 1, new QStandardItem("11"));
model->setItem(1, 1, new QStandardItem("22"));
model->setItem(2, 1, new QStandardItem("50"));
model->setItem(0, 2, new QStandardItem("1"));
model->setItem(1, 2, new QStandardItem("2"));
model->setItem(2, 2, new QStandardItem("3"));
ui->tableView->setModel(model);
QTableView的属性以及属性对应呈现的效果为:
cornerButtonEnabled
此属性设置左上角的按钮是否启用,如果启用,点击左上角的按钮则会全选表格,默认情况是启用的。
把这个关闭之后:
ui->tableView->setCornerButtonEnabled(false);
gridStyle
此属性设置表格的网格线的风格。
默认情况下是一个实线
在修改成虚线之后:
ui->tableView->setGridStyle(Qt::DashLine);
showGrid
sortingEnabled
此属性设置是否允许排序,默认是禁用排序;注意,当调用setSortingEnable函数之后,会自动调用sortByColumn来进行一次排序。
wordWrap
同上面介绍的QListView的wordWrap属性一致。
最基础的QTreeView使用方式如下:
QFileSystemModel* fileModel = new QFileSystemModel();
fileModel->setRootPath("D:/Desktop");
ui->treeView->setModel(fileModel);
ui->treeView->setRootIndex(fileModel->index("D:/Desktop"));
QTreeView的属性以及属性对应呈现的效果为:
allColumnsShowFocus
此属性设置是不是为所有列都显示键盘焦点。默认情况是false。
设置成true之后:
ui->treeView->setAllColumnsShowFocus(true);
animated
此属性设置分支的展开或者收起是否有动画,默认是false
启用动画后:
ui->treeView->setAnimated(true);
autoExpandDelay
此属性设置当拖动一个项到一个分支时,分支会延时一段时间之后,自动展开。默认值是-1,代表关闭自动展开功能。
开启之后,效果如下:
ui->treeView->setAutoExpandDelay(100);
ui->treeView->setDragEnabled(true);
ui->treeView->setDragDropMode(QAbstractItemView::DragDrop);
expandsOnDoubleClick
此属性设置是否可以双击展开或收起,默认是可以。
设置为false之后
ui->treeView->setExpandsOnDoubleClick(false);
headerHidden
ui->treeView->setHeaderHidden(true);
indentation
ui->treeView->setIndentation(40);
itemsExpandable
rootIsDecorated
sortingEnabled
同QTableView的sortingEnable属性
uniformRowHeights
类似与QListView的uniformItemSizes属性,此处是统一的行高
wordWrap
同QListView的wordWarp属性