• 6482阅读
  • 7回复

[提问]QTableWidget设置和删除cellwidget问题 [复制链接]

上一主题 下一主题
离线nanzsn
 
只看楼主 倒序阅读 楼主  发表于: 2013-07-13
— 本帖被 XChinux 从 其它技术开发讨论区 移动到本区(2013-07-13) —
关键词: setremoveCellWidget
做一个17行9列的QTableWidget,在第一列需要实现这样的效果:双击第一列某个单元,单元显示QComboBox,然后选择一个项目,作为该单元的内容,并且获取到该内容后,能够只显示该内容而不显示QComboBox,然后再次双击,可以重复上面的操作。我知道可以采用  委托 来处理,但是有些麻烦。是否可以采用 setCellWdget(),removeCellWidget(),cellWidget()3个函数来实现这个操作呢? removeCellWidget()是怎样的效果,貌似不会彻底删除该QComboBox,而再次设置某个单元格widget为QComboBox,程序会异常退出,不知道是怎么回事。代码说明如下:该函数响应双击事件,treecomboxs,labels分别是已经初始化好的QVector,也是17个元素。代码只是测试一下再次点击某个单元的时候,是否会异常退出。帮助文档里说,设置新的cellwidget时,会自动取代掉以前的cellwidget,我试了不成功,所以加了removeCellWidget试试看,可以保证程序其他地方是没有问题的。仅贴出bug出现的代码。
void ParameterTable::onDoubleClickedCell(int row, int column){    if(column == 0)    {        this->removeCellWidget(row,0);        this->setCellWidget(row,0,treecomboxs[row]);        this->removeCellWidget(row,0);        this->setCellWidget(row,0,labels[row]);    }}
离线XChinux

只看该作者 1楼 发表于: 2013-07-13
最好的实现方法就是写delegate.
二笔 openSUSE Vim N9 BB10 XChinux@163.com 网易博客 腾讯微博
承接C++/Qt、Qt UI界面、PHP及预算报销系统开发业务
离线nanzsn
只看该作者 2楼 发表于: 2013-07-13
回 1楼(XChinux) 的帖子
用delegate实现了,挺方便的,非常感谢!
离线nanzsn
只看该作者 3楼 发表于: 2013-07-13
回 1楼(XChinux) 的帖子
有一个问题,就是当我不断的双击使用自定义委托的那个单元格时,内存会不断增长,有没有办法是所有的使用这个委托的单元格都用同一个对象,而不是在createEditor函数中每次都动态生成一个对象。代码如下:
QWidget *ParameterDelegate::createEditor(QWidget *parent,
        const QStyleOptionViewItem &option,
        const QModelIndex &index) const
{
    if (index.column() == parametercolumn) {
        TreeComboBox * argument_combobox = new TreeComboBox(parent);
        connect(argument_combobox, SIGNAL(highlighted(QString)),
                this, SLOT(commitAndCloseEditor()));
        return argument_combobox;
    }
    else
    {
        return QItemDelegate::createEditor(parent, option, index);
    }
}
TreeComboBox 是一个自定义的QComboBox子类,这样每次双击使用委托那一列时,都要新建new一个 这样的QComboBox导致内存不断增长,应该怎样解决呢?
离线pxiao_xiao

只看该作者 4楼 发表于: 2013-07-13
你把你的view的那行列值用QStringList赋值 双击自动变combox
离线nanzsn
只看该作者 5楼 发表于: 2013-07-13
回 4楼(pxiao_xiao) 的帖子
我的代码本身是可以双击的,问题就在于,每双击一次,内存就有所增长,感觉很奇怪,查了一下,也没发现哪有内存泄露问题。
离线pxiao_xiao

只看该作者 6楼 发表于: 2013-07-13
QTableWidget插入widget后在隐藏再显示 如果你delete widget 你会发现内存删了 界面上未删除 这等于内存上还是有内存未删
离线nanzsn
只看该作者 7楼 发表于: 2013-07-14
回 6楼(pxiao_xiao) 的帖子
好的,谢谢,我试试。
快速回复
限100 字节
 
上一个 下一个