QTableView 的美化

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

QTableView分成表头(Header)和表体(body)两部分。

对于表头,我们需要做的不多,仅仅是换下背景色,去掉分节虚线,隐藏掉垂直表头。

于是:1 m_procssTableView->verticalHeader()->hide();
2 m_procssTableView->horizontalHeader()->setSectionsClicka ble(false);
3 m_procssTableView->horizontalHeader()->setStretchLastSec tion(true);
4 m_procssTableView->setSelectionBehavior(QAbstractItemVie w::SelectRows);
5 m_procssTableView->setSelectionMode(QAbstractItemView::S ingleSelection);
6 m_procssTableView->setEditTriggers(QAbstractItemView::No EditTriggers);
7 m_procssTableView->setVerticalScrollMode(QAbstractItemVi ew::ScrollPerPixel);
8 m_procssTableView->setHorizontalScrollMode(QAbstractItem View::ScrollPerPixel);
9 m_procssTableView->setShowGrid(false); // disable the t able grid.
10 m_procssTableView->verticalHeader()->setDefaultSectionSi ze(25); // set row height.
11 m_procssTableView->horizontalHeader()->setHighlightSecti ons(false);
12 m_procssTableView->setFrameShape(QFrame::NoFrame);
13 m_procssTableView->setItemDelegate(new NoFocusFrameDeleg ate());
表体部分,我们需要去掉网格线,这样看起来更加简洁。

一格格的被网格线分开反而觉得被束缚了。

其他的就是一些常见的设置选项,不必多说。

另外要注意的是,我们总可以看到即便去掉了网格线,当我们鼠标点击某一行时,Qt仍然会在鼠标下的单元格周围画上一个选线框。

这看起来就像白玉中的一点瑕疵,忍不住就要把它抠出去。

网上对此的做法是,自定义一个条目委托(Item Delegate),并重写paint()方法:
1void NoFocusFrameDelegate::paint(QPainter *painter, const QS tyleOptionViewItem &option, const QModelIndex &index) const
2{
3 QStyleOptionViewItem itemOption(option);
4// remove the focus state
5if (itemOption.state & QStyle::State_HasFocus)
6 {
7 itemOption.state ^= QStyle::State_HasFocus;
8 }
9 QStyledItemDelegate::paint(painter, itemOption, index);
10 }
上面的代码很简单,仅仅是去掉了State_HasFocus这个状态,绘制工作仍然交由委托实现。

QTableView的上下文菜单,则需要重写contextMenuEvent()实现。

上下文的菜单项背景色仍然可以用QSS进行控制。

另外,QTableView还有一个单元格对齐的问题。

QTableView的默认显示都是左对齐。

这时,如果要想某一列都是居中对齐该怎么办那?答案是从QStandardItemModel类派生一个子类,重写虚函数data()。

为什么不是从QTableView继承呢?因为我们使用了Qt中的MVC框架。

View只管绘制Model中的数据,至于数据内容、格式设置什么的,都在Model里面设置。

因此,使用MVC的时候我们大部分工作需要和Model 打交道。

话又说回来。

这个data()函数带两个参数,第一个参数可以控制那几列(行)怎么对齐。

第二个参数是一个Role类型,用于区分不同的数据类型。

因为Qt里面的数据分很多种:
我们得指明,当数据是用来显示在单元格中的时候,我们才设置对齐方式啊。

不然的话就会乱套了。

总之,QSS和2D绘图用好了,界面的效果也会慢慢炫起来。

如果自己能够做出精美的界面素材,那么更加是锦上添花了。

遇到的问题
wchar_t的问题。

由于底层使用了Windows API实现,免不了要和宽字符打交道。

于是用上了QString类的两个静态方
法:fromStdString (), fromStdWString()。

用来将标准的string和wstring类型转换为QString类型。

但是在链接的时候出错了:。

相关文档
最新文档