• 4734阅读
  • 5回复

想实现一个特殊功能的表格,大家看看怎么做? [复制链接]

上一主题 下一主题
离线firerun
 

只看楼主 倒序阅读 楼主  发表于: 2012-05-10
要实现一个表格,主要以列为单位显示,支持列的拖动,列内可嵌入表格,每列还有一个大的图像,其中有些列还要显示几个图片,单击图片能弹出一个浏览图片的大图。

问题
1.准备用QItemDelegate,根据数据的不同,画不同的图形,比如有的数据项里边存储了方形,有的里边存储了圆形,但是,画出来的东西怎么能识别鼠标点击?我觉得列里边显示的图片就必须以一个对象存在,当对象捕捉到鼠标点击后进行相应的操作,不然是listView捕捉到鼠标事件,怎么来实现操作?
2,有没有更好的方法,我对modew-view这块东西还不是很熟悉。
3,单元格内嵌入表格,这个要怎么做?
欢迎大家的讨论。
离线firerun

只看该作者 1楼 发表于: 2012-05-10
  1. enum
  2. {
  3.     STANDARDITEM,
  4.     DEPATH
  5. };
  6. class StandardItem
  7. {
  8. public:
  9.     StandardItem(const int columnId = STANDARDITEM) : columnId(columnId) {}
  10.     int columnId;
  11. };
  12. class Depath : public StandardItem
  13. {
  14. public:
  15.     Depath() : StandardItem(DEPATH) {}
  16.     int start;
  17.     int end;
  18.     int interval;
  19. };
  20. Q_DECLARE_METATYPE(StandardItem);
  21. Q_DECLARE_METATYPE(Depath);
  22. int TableSequence[4][2] = {{DEPATH, STANDARDITEM}, {STANDARDITEM, STANDARDITEM},
  23.                            {STANDARDITEM, STANDARDITEM}, {STANDARDITEM, STANDARDITEM}};
  24.                           
  25.                           
  26.     QStandardItemModel model(4, 2);
  27.     QTableView tableView;
  28.     
  29.     
  30.     tableView.setModel(&model);
  31.     
  32.     
  33.     
  34.     for (int row = 0; row < 4; row++)
  35.     {
  36.         for (int column = 0; column < 2; column++)
  37.         {
  38.             QModelIndex index = model.index(row, column, QModelIndex());
  39.             QVariant variant;//((row+1) * (column+1));
  40.             switch (TableSequence[row][column])
  41.             {
  42.             case DEPATH:
  43.                 variant.setValue(depathModel);
  44.                 qDebug() << __LINE__;
  45.                 break;
  46.             default:
  47.                 variant.setValue(standardItem);
  48.                 qDebug() << __LINE__;
  49.             }
  50.             model.setData(index, variant, 20);
  51.         }
  52.     }
  53. //another file
  54. void SpinBoxDelegate::paint(QPainter * painter, const QStyleOptionViewItem & option, const QModelIndex & index) const
  55. {
  56.     qDebug() << index.data(20).value<StandardItem>().columnId;
  57.     switch (index.data(20).value<StandardItem>().columnId)
  58.     {
  59.     case DEPATH:
  60.         painter->drawLine(0, 5, 20, 5);
  61.         break;
  62.     default:
  63.         break;
  64.     }
  65. }

不知道为什么,在paint函数里打印出来的值都是0,应该有一个值是1的啊,每个单元格都调用一次paint函数的,第一个应该是1吧。

离线firerun

只看该作者 2楼 发表于: 2012-05-10
这个发现问题了,看第35~53行的代码,
在QVariant 的 setValue(); 设置的内容,读取出来的时候可以读取为随便的类型啊,基类可以被读取为派生类。
离线passion_wu
只看该作者 3楼 发表于: 2012-05-10
Qt的Model/View加上delegate是非常强大的,你说的这个需求应该不难实现。可以参照下demo
离线firerun

只看该作者 4楼 发表于: 2012-05-11
请发表建设性意见,三楼的,你适合当领导。
离线firerun

只看该作者 5楼 发表于: 2012-05-11
我在考虑用model-view还是graphicsview
快速回复
限100 字节
 
上一个 下一个