• 欢迎浏览“String me = Creater\忠实的资深Linux玩家;”,请文明浏览,理性发言,有侵犯你的权益请邮件我(creater@vip.qq.com).
  • 把任何的失败都当作一次尝试,不要自卑;把所有的成功都想成是一种幸运,不要自傲。
  •    5年前 (2013-12-06)  QT |   9 条评论  28 
    文章评分 0 次,平均分 0.0

    默认的情况下,QTableView,QTableWidget等控件,当item选中后其背景色为蓝色的,文字颜色(前景色)为白色的,如图:
    1
    如果我们想动态的更改item的前景色(例如值大于零显示红色,小于零显示绿色),并且选中后文字颜色不变(这个是我想实现的,其实就是模仿一般的股票价格图表),怎么办呢? 首先在添加或者修改item的时候,可以使用:

    model->item(row, column)->setForeground(QBrush(QColor(255, 0, 0)));  //把表格的item的文字颜色设置为红色

    但是只这样还是不够的,这样只能保证在不选中的情况下显示为红色, 若不做其他设置,选中后item的颜色照样变成白色的了。对此我找到了使用代理的方法,使选中后的文字颜色和选中前的文字颜色一致(也可以灵活修改),效果如下图,代码随后。

    2
    //黄色的那行为选中

    //委托(代理)
    class ItemDelegate : public QItemDelegate
    {
        Q_OBJECT
    public:
        ItemDelegate()
        {
        }
        void paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const
        {
            QStyleOptionViewItem  viewOption(option);
            //高亮显示与普通显示时的前景色一致(即选中行和为选中时候的文字颜色一样)
            viewOption.palette.setColor(QPalette::HighlightedText, index.data(Qt::ForegroundRole).value<QColor>());
            QItemDelegate::paint(painter, viewOption, index);
        }
    };

     

        view = new QTableView;
        model = new QStandardItemModel;
        view->setModel(model);
        view->setItemDelegate(new ItemDelegate);

     

            if (strList[2].toDouble() >= strList[3].toDouble())
                model->item(row, 2)->setForeground(QBrush(QColor(255, 0, 0)));
            else
                model->item(row, 2)->setForeground(QBrush(QColor(0, 127, 0)));
            if (strList[4].toDouble() >= strList[3].toDouble())
                model->item(row, 4)->setForeground(QBrush(QColor(255, 0, 0)));
            else
                model->item(row, 4)->setForeground(QBrush(QColor(0, 127, 0)));
     

    除特别注明外,本站所有文章均为String me = "Creater\忠实的资深Linux玩家";原创,转载请注明出处来自http://unix8.net/home.php/2749.html

    关于

    发表评论

    暂无评论

    切换注册

    登录

    忘记密码 ?

    切换登录

    注册

    扫一扫二维码分享