美文网首页C++
36.QTableview重绘应用(学做菜工具制作)--Appl

36.QTableview重绘应用(学做菜工具制作)--Appl

作者: applecai | 来源:发表于2021-09-05 13:06 被阅读0次

一,前言

本周业余时间主要是设计一个数据库和Qtableview的应用小工具,用来督促自己学习做菜。享受DIY的乐趣~

二,需求

记录菜谱,包括QTableview,以及dock窗口用来显示具体菜谱信息

三,遇到的问题

  1. 图片如何保存到数据库,应该如何设计?
    答:保存路径到数据库。实际的图片可以用如下方法显示到QLabel,因为支持富文本。
        QString picName = "a.png"; //可以从数据库获取
        QString savepath = "<img src = '"+QApplication::applicationDirPath() + "/pic/" + picName+"'/>";
        menupic->setText(savepath);
    
    但是无法重置大小,所以还是采用标准方法
        labels[3]->resize(100,100);
        QImage *img=new QImage; //新建一个image对象
        img->load(QApplication::applicationDirPath() + "/pic/" + picName); //将图像资源载入对象img,注意路径,可点进图片右键复制路径
        labels[3]->setPixmap(QPixmap::fromImage(*img).scaled(labels[3]->size()));
    
  2. QTableView中第一列默认列隐藏?
    答:tableView->verticalHeader()->hide();
  3. 鼠标按住列名可自由拖动列的位置应该如何实现?
    答:table->horizontalHeader()->setSectionsMovable(true);
  4. 排序方法
    答:用代理类,加壳后可以操作排序了。
        QSortFilterProxyModel *sqlproxy = new QSortFilterProxyModel(this);
        sqlproxy->setSourceModel(model);
        //sqlproxy->setFilterKeyColumn(0);//设置第一列过滤
        table->setModel(sqlproxy);
        table->setSortingEnabled(true);//排序使能
    
    另外,网上看到sqlproxy->setFilterRegExp(regExp)就可以使用正则表达式排序。
  5. 某列显示图片
    答:受欢迎度输入1-5的数字,但是显示的时候要用图片。通过重绘QSqlQueryModel显示的模型data。
    QVariant MySqlQueryModel::data(const QModelIndex & index, int role) const
    {
        if (!index.isValid())
            return QVariant();
    
        if(role== Qt::CheckStateRole)
        {
            if(index.column() == 0)
            {
                if (check_state_map.contains(index.row()))
                    return check_state_map[index.row()] == Qt::Checked ? Qt::Checked : Qt::Unchecked;
                return Qt::Unchecked;
            }
        }
        if(role==Qt::DecorationRole)
        {
            if(index.column() == 3)
            {
                QPixmap pix;
                int cmp;
                cmp = index.data().toInt();
                //cmp = map[index.row()];
                switch(cmp)
                {
                case 1:
                    pix.load(":/res/img/star.png");
                    break;
                case 2:
                    pix.load(":/res/img/star2.png");
                    break;
                case 3:
                    pix.load(":/res/img/star3.png");
                    break;
                default:
                    break;
                }
                pix = pix.scaled(24,24,Qt::KeepAspectRatioByExpanding);
                return pix;//piclist[index.row()];
            }
        }
           // 否则返回默认的
        return QSqlQueryModel::data(index,role);
    }
    
image.png
  1. 通过重新QSqlQueryModel无法解决仅显示图片问题?
    答:使用itemDelegate,通过paint重绘。
    void picItemDelegate::paint(QPainter* painter, const QStyleOptionViewItem& option, const QModelIndex& index) const
    {
        if (index.column() == 3)//UE
        {
            int repeat = index.data().toInt();
            int row = index.row();
            int x = option.rect.x();
            int y = option.rect.y();
            int width = option.rect.width();
            int height = option.rect.height();
            //qDebug()<<"x="<<x<<"y="<<y;
            QPen pen_black;
            pen_black.setWidth(2);
            pen_black.setColor(QColor(Qt::darkGreen));
            QStyleOptionViewItem myOption = option;
            int r1 = (width<height)?width/2:height/2;
            int offset = 2;
            r1 = r1-offset;
            //qDebug()<<"r1"<<r1;
            painter->setPen(pen_black);
            painter->setBrush(Qt::green);
            for(int i=0;i<repeat;i++)
            {
                QPoint point(x+r1+offset+i*2*(r1+offset),y+r1+offset);   //圆心
                painter->drawEllipse(point,r1,r1); //画圆
            }
        }
    }
    
    使用起来很简单,放弃重写QSqlQueryModel模型,直接在原来的QSqlQueryModel上,为第三列受欢迎度重绘Item。
        picItem_delegate = new picItemDelegate();
        //table->setItemDelegate(picItem_delegate);
        table->setItemDelegateForColumn(3, picItem_delegate);
    
image.png

四,效果

主界面


image.png

其它界面


image.png

五,小结

好了,这个周末业余时间把小工具完成了,接着可以用此工具督促我学习做菜了。之后按使用过程中的需求可能再优化下,加些工具栏,主界面的搜索栏,因为当前只能按列来排序。自给自足的感觉真好,不但自己做菜,连工具都是自己做,哈哈~

相关文章

  • 36.QTableview重绘应用(学做菜工具制作)--Appl

    一,前言 本周业余时间主要是设计一个数据库和Qtableview的应用小工具,用来督促自己学习做菜。享受DIY的乐...

  • 用PS制作APP应用页面

    本实例制作的是APP应用页面的制作方法。案例中运用了大量的图层样式,以做出令人震撼的图像效果,并使用多种图形工具绘...

  • MAC显示隐藏文件

    只要打开终端(位于应用程序——实用工具),将以下代码复制进去然后回车defaults write com.appl...

  • xcode病毒

    危机来自第三方 Xcode 工具 国内多个厂商的大牌应用使用了第三方途径下载的 Xcode 开发工具(非 Appl...

  • 微课制作指导服务总结与复盘

    一、 计划实现目标 工具应用和制作: l 从提交的微课作品反映的工具应用或制作技术方面的问题,针对问题给出课件提升...

  • Spring Cloud学习笔记:名词解释列表【持续更新】

    1. Spring Cloud Spring Cloud 应用程序:云原生应用(Cloud Native Appl...

  • 应用重签名 & 以及脚本 (10)

    应用重签名 (10) codesign (签名工具) Xocde提供了签名工具,codesign,我们通过几个命令...

  • 软件

    懒饭 看视频学做菜 alook浏览器 itext 图片识别OCR Motrix 下载工具 photoZoom p...

  • 学做菜

    今天晚上,我学做了一道菜。你们知道这道菜叫什么吗?那我就告诉你吧。 我先把两根香肠用菜刀切成一小块一小块。...

  • 学做菜

    初到东莞的时候很勤快,经常自己做饭,不知道从什么时候开始很讨厌煮饭,更讨厌厨房的味道。 最近心情好的时候...

网友评论

    本文标题:36.QTableview重绘应用(学做菜工具制作)--Appl

    本文链接:https://www.haomeiwen.com/subject/vfejwltx.html