QTableView 的美化

更新时间:2023-09-18 07:55:01 阅读量: 幼儿教育 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

QTableView分成表头(Header)和表体(body)两部分。对于表头,我们需要做的不多,仅仅是换下背景色,去掉分节虚线,隐藏掉垂直表头。于是: 1 m_procssTableView->verticalHeader()->hide();

2 m_procssTableView->horizontalHeader()->setSectionsClickable(false);

3 m_procssTableView->horizontalHeader()->setStretchLastSection(true);

4 m_procssTableView->setSelectionBehavior(QAbstractItemView::SelectRows);

5 m_procssTableView->setSelectionMode(QAbstractItemView::SingleSelection);

6 m_procssTableView->setEditTriggers(QAbstractItemView::NoEditTriggers);

7 m_procssTableView->setVerticalScrollMode(QAbstractItemView::ScrollPerPixel);

8 m_procssTableView->setHorizontalScrollMode(QAbstractItemView::ScrollPerPixel);

9 m_procssTableView->setShowGrid(false); // disable the table grid.

10 m_procssTableView->verticalHeader()->setDefaultSectionSize(25); // set row height.

11 m_procssTableView->horizontalHeader()->setHighlightSections(false);

12 m_procssTableView->setFrameShape(QFrame::NoFrame); 13 m_procssTableView->setItemDelegate(new NoFocusFrameDelegate());

表体部分,我们需要去掉网格线,这样看起来更加简洁。一格格的被网格线分开反而觉得被束缚了。其他的就是一些常见的设置选项,不必多说。另外要注意的是,我们总可以看到即便去掉了网格线,当我们鼠标点击某一行时,Qt仍然会在鼠标下的单元格周围画上一个选线框。这看起来就像白玉中的一点瑕疵,忍不住就要把它抠出去。网上对此的做法是,自定义一个条目委托(Item Delegate),并重写paint()方法:

1 void NoFocusFrameDelegate::paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const 2 {

3 QStyleOptionViewItem itemOption(option); 4 // remove the focus state

5 if (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类型。但是在链接的时候出错了:

本文来源:https://www.bwwdw.com/article/nsah.html

Top