• 13047阅读
  • 10回复

如何在QTableView中的一列或一行上添加控件 [复制链接]

上一主题 下一主题
离线shiziyang
 

只看楼主 倒序阅读 楼主  发表于: 2013-01-25
— 本帖被 XChinux 从 Qt基础编程 移动到本区(2013-01-25) —
不是那种createEditor出来的,是那种始终存在的。
没有不使用QAbstractItemView::setIndexWidget以外的方法?就是说是否可在delegate或model里实现?
离线rpdhunter

只看该作者 1楼 发表于: 2013-01-25
QItemDelegate类就是为你说的功能而建的,具体可以参考demo
离线XChinux

只看该作者 2楼 发表于: 2013-01-25
对,写delegate,看它的paint()函数,里面你可以想画什么画什么。
二笔 openSUSE Vim N9 BB10 XChinux@163.com 网易博客 腾讯微博
承接C++/Qt、Qt UI界面、PHP及预算报销系统开发业务
离线XChinux

只看该作者 3楼 发表于: 2013-01-25
另外,你可以看看《Qt高级编程》里的3-6章,里面有你想要的。
二笔 openSUSE Vim N9 BB10 XChinux@163.com 网易博客 腾讯微博
承接C++/Qt、Qt UI界面、PHP及预算报销系统开发业务
离线shiziyang

只看该作者 4楼 发表于: 2013-01-28
回 2楼(XChinux) 的帖子
那难道我想给一列里的每一行加个combobox之类的东西,整个combobox包括下拉框都要自己画出来?还有操作时的消息要怎么弄?
离线realfan

只看该作者 5楼 发表于: 2013-01-28
回 4楼(shiziyang) 的帖子
首先,创建一个combobox代理
class ComboDelegate : public QItemDelegate
{
    Q_OBJECT

public:
    ComboDelegate(QObject *parent = 0);

    QWidget *createEditor(QWidget *parent, const QStyleOptionViewItem &option, const QModelIndex &index) const;
    void setEditorData(QWidget *editor, const QModelIndex &index) const;
    void setModelData(QWidget *editor, QAbstractItemModel *model, const QModelIndex &index) const;
    void updateEditorGeometry(QWidget *editor, const QStyleOptionViewItem &option, const QModelIndex &index) const;
};
实现里面声明的方法,具体参考帮助文档。
然后,在表中,为某一列设置代理
比如,第二列
pComboDelegate = new ComboDelegate();
pTable->setItemDelegateForColumn(1,  pComboDelegate);
这样,每行的第二列,需要编辑时,双击,就会出现combobox了
离线shiziyang

只看该作者 6楼 发表于: 2013-01-29
回 5楼(realfan) 的帖子
也就是说可以理解成:如果不是在编辑时才显示combobox而是始终显示,那就要在paint()里先用style()去先画出来一个假的,然后在编辑时才创建一个真的去操作?
那如果我想在一个单元格里左边一个lineedit,右边一个combobox,也是编辑时创建一个widget,然后上面扔这两个控件,然后在paint里也同样画这两个控件来保证其始终会显示了?这样的话是不是两控件的位置要保证一致才行了?不然编辑和非编辑状态的位置会有偏移。
离线realfan

只看该作者 7楼 发表于: 2013-01-29
回 6楼(shiziyang) 的帖子
代理是用updateEditorGeometry控制控件位置的
editor->setGeometry(option.rect);
你想自已做的话,可以试试setCellWidget ( int row, int column, QWidget * widget )函数
应该比paint要方便些
离线shiziyang

只看该作者 8楼 发表于: 2013-01-29
回 7楼(realfan) 的帖子
多谢指教,因为大概会出现数万条以上的记录,所以不能用selCellWidget这种效率低的函数,看来还得自己paint了。
离线realfan

只看该作者 9楼 发表于: 2013-01-29
回 8楼(shiziyang) 的帖子
那何苦让控件一直显示呢,在编辑时再显示,不够用吗?
离线shiziyang

只看该作者 10楼 发表于: 2013-01-29
回 9楼(realfan) 的帖子
比如一个item里左边有一句话的开头,然后右边还有一个带下划线的“详细”字样,需要点击弹一个对话框显示全部内容,一般我是把那个“详细”作为按钮来实现的,这样就不能在编辑时才显示控件了。
快速回复
限100 字节
 
上一个 下一个