QT学习笔记之QT5 + VS2013/VS2015 中文乱码解决办法以及ListView,TableView,TreeView的基本用法
写在前面
额呵呵呵呵,我又来装逼了,其实也不是很难的一个问题,但是就是记不起来怎么去解决,我还是记录一下吧!(本宝宝智商实在捉急啊!T_T)
解决办法
就在头文件里面加上这句就可以了!
#pragma execution_character_set("utf-8")
这个定义无论是在微软的VS还是在QCreator里面都可以解决中文乱码的问题。
这张截图是在QCreator里头的截图
TreeView, ListView,TableView
额,如果我说这就结束了,应该会有人打我吧(委屈!T_T)
好了,说下下个问题吧!最近在做一个项目用到了ListView,但是我翻阅了大量的文档(除了官方的文档!T_T),发现好像没有这方面的解决办法啊!好吧,通过百度找到了以下解决办法。
理解的办法,我们先定义一个用于设置List模型的对象,也就是QStandardItemModel的对象,你可以理解为这就是那个ListView了(实际上不是啊,这只是listView的一个模式而已),然后我们要塞入一条一条的数据值对吧!嗯,我们这时候就要定义一系列的QStandardItem的对象来填充那个QStandardItemModel对象,当我们设置完这些数据以后,就可以调用ListView的setModel()方法来把这个Model设置到ListView上面。
好啦,呈上我的代码。这是借鉴了其他人的代码而来的。
//ListView 用法
QStringList list;
list.append("a");
list.append("b");
list.append("c");
list.append("d");
list.append("e");
list.append("f");
list.append("g");
list.append("h");
list.append("i");
list.append("j");
list.append("k");
for (int i = 0; i < list.size(); i++)
{
QString str = static_cast<QString>(list.at(i));
QStandardItem* item_1 = new QStandardItem(str);
QStandardItem* item_2 = new QStandardItem(str);
if (i % 2 == 0)
{
//只是用于设置设条数据的显示框的颜色
QLinearGradient linearGrad(QPointF(0, 0), QPointF(200, 200));
linearGrad.setColorAt(0, Qt::darkGreen);
linearGrad.setColorAt(1, Qt::yellow);
QBrush brush(linearGrad);
item_1->setBackground(brush);
}
this->itemModel_1->appendRow(item_1);
this->itemModel_2->appendRow(item_2);
}
ui.listView_1->setModel(itemModel_1);
ui.listView_2->setModel(itemModel_2);
this->connect(ui.listView_1, SIGNAL(QListView::clicked(QModelIndex)), this, SLOT(itemChecked(QModelIndex)));
}
运行结果如下:
另外不要怀疑c这条数据有问题,谁知道这个ListView的数据是可以双击修改的,然后手贱去双击了一下,居然变成了EditLine,然后就成了这样的。巨坑。
如果你要让这个listView不可双击修改,直接设置他的Enable为true就可以了吧!
好了这次就到这里了,下次在更新tableView和treeView吧!
好了,经过一天的休整,终于完成了tableView和treeView的示例,一一展示吧!
tableView是一个表格形式的,所以必须在使用前设置表头,也就是setHorizontalHeaderItem()这个函数的作用,设置完表头以后就可以设置数据了;设置数据也是比较简单的,只需要在QStandardItemModel的对象里头设置每行每列的数据就可以了,注意显示在表格上的数据得用QStandardItem的对象进行包装!
this->itemModel_2 = new QStandardItemModel(this);
//设置表头
itemModel_2->setHorizontalHeaderItem(0, new QStandardItem(tr("字母")));
itemModel_2->setHorizontalHeaderItem(1, new QStandardItem(tr("说明")));
//设置表格属性 具体查看API 这里设置的是选中时整行被选中
ui.tableView->setSelectionBehavior(QAbstractItemView::SelectRows);
//设置数据
for (int i = 0; i < list.size(); i++)
{
QString str = static_cast<QString>(list.at(i));
//设置第i行,第0列的数据
itemModel_2->setItem(i, 0, new QStandardItem(str));
//设置第i行,第1列的数据
itemModel_2->setItem(i, 1, new QStandardItem(tr("三生三世,十里茅坑!")));
}
ui.tableView->setModel(itemModel_2);
treeView就是一个属性的结构,就好比我们安装软件时,选择目录时的那种结构,这个结构有些复杂;(我找到的资料不知道是QT几的,我只是分享我在QT5.8编译成功的例子),这个treeView也是可以设置表头的,如果你要设置这个信息,就用setHorizontalHeaderLabels()配合list来一次设置表头,也是比较方便的;接下来就是添加数据了,最外面的一层由QStandardItemModel的对像来添加,下面的子节点就由父节点来进行添加
//treeView 的用法
itemModel_3 = new QStandardItemModel(ui.treeView);
itemModel_3->setHorizontalHeaderLabels(QStringList() << tr("字母") << tr("说明"));
//添加父级节点 A
QStandardItem* item = new QStandardItem("A");
//这里是由QStandardItemModel的对象来进行添加
itemModel_3->appendRow(item);
//在A的下面添加一个子节点 a
QStandardItem* item1 = new QStandardItem("a");
//上面我们只是把第一列的树形结构生成完毕了,第二列的数据还是空白的
//这里节点的添加就由A这个节点进行,千万别用model进行添加,否则就又添加了一个父级节点而不是A的子节点
item->appendRow(item1);
//因为我们的表头有两列,所以还得设置第二列的数据,如果是添加父级节点的数据,那么就用model的setItem()函数,如果是添加子节点的数据,那么就用那个父节点来setChild()设置这个数据。这里一定要注意序号,子节点一定是从0行开始的,然后后面就是你要设置数据的列数,最后就是数据
itemModel_3->setItem(0, 1, new QStandardItem("三生三世,十里菊花"));
item->setChild(0, 1, new QStandardItem("你想搞事情啊!"));
ui.treeView->setModel(itemModel_3);
总结
这些控件都是利用QStandardItemModel和QStandardItem来进行数据的设置,QStandardItemModel负责设置外观,而QStandardItem则负责设置每一条的数据,而我们用设计工具拖的控件,我们可以理解为一个容器,用来显示以及填装数据用的。
源码在这里,需要一个积分哦!意思意思下。http://download.csdn.net/detail/pkgk2013/9764351