• 8954阅读
  • 9回复

[提问]treeiew 中如何现实进度条!!! [复制链接]

上一主题 下一主题
离线aishang
 
只看楼主 倒序阅读 楼主  发表于: 2011-03-21
    刚学qt没多久,c++也是。现在想再treeview里面显示进度条,看了帮助文档没看明白。来个大哥具体点指点下。这是我在treeview里面写的header。
QGroupBox *MainWindow::createPushButtonGroup()
{
    QGroupBox *groupBox = new QGroupBox;
    tree = new Tree;
    QStandardItemModel *goodsModel = new QStandardItemModel(0, 6,this);
    goodsModel->setHeaderData(0, Qt::Horizontal, tr("Reader"));
    goodsModel->setHeaderData(1, Qt::Horizontal, tr("Hardware"));
    goodsModel->setHeaderData(2, Qt::Horizontal, tr("Software"));
    goodsModel->setHeaderData(3, Qt::Horizontal, tr("Action"));
    goodsModel->setHeaderData(4, Qt::Horizontal, tr("SN"));
    goodsModel->setHeaderData(5, Qt::Horizontal, tr("State"));
    tree->setModel(goodsModel);
    tree->setColumnWidth(0,tree->width()/3);
    tree->setColumnWidth(1,tree->width()/3);
    tree->setColumnWidth(2,tree->width()/3);
    tree->setColumnWidth(3,tree->width()/12);
    tree->setColumnWidth(4,tree->width()/12);
    tree->setColumnWidth(5,tree->width()/12);
    tree->setSortingEnabled(true);
    QStandardItem *ReaderName = new QStandardItem("AA-AA-AA-00-01");
    goodsModel->setItem(0,0,ReaderName);
    tree->setItemDelegate(new ImageDelegate(tree));
    QVBoxLayout *hbox = new QVBoxLayout(this);
    hbox->addWidget(tree);
    groupBox->setLayout(hbox);
    return groupBox;
}看了网上说的好像要重新上线paint这个类。不明白啊不明白!
离线wxj120bw

只看该作者 1楼 发表于: 2011-03-22
楼主想在treeview怎么显示进度条,如果想在treeview下面加个进度条,可以用qlayout相应的类来布局实现。
离线jdwx

只看该作者 2楼 发表于: 2011-03-22
用treewidget
发帖时要说明:操作系统、Qt版本、编译器,这样能更快的得到回复。
离线aishang
只看该作者 3楼 发表于: 2011-03-22
你说的这个我也上网上看了。这个是代码!
#include <QApplication>
#include <QLineEdit>
#include <qDebug>
#include <QTime>
#include <QTreeWidget>
#include <QStringList>
#include <QItemDelegate>
#include <QProgressBar>
class ImageDelegate : public QItemDelegate
{


public:
    ImageDelegate(QObject *parent = 0):QItemDelegate(parent){};
    QWidget *createEditor(QWidget *parent, const QStyleOptionViewItem &option,
        const QModelIndex &index) const
    {
        QProgressBar *progress = new QProgressBar(parent);
        progress->setValue(20);
        return progress;
    };
};

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    QTreeWidget tree;
    tree.setColumnCount(1);
    tree.setHeaderLabels(QStringList() << "colum");
    tree.setItemDelegate(new ImageDelegate(&tree));
    QTreeWidgetItem *item1 = new QTreeWidgetItem(&tree);
    tree.openPersistentEditor(item1);
    QTreeWidgetItem *item2 = new QTreeWidgetItem(&tree);
    item2->setText(0, "aaaa");
    tree.show();
    return a.exec();
}
但是有个问题了,进度条的值如何能变化起来,现在只能初始化一个定值。qt菜鸟啊我,多多指教!
离线wxj120bw

只看该作者 4楼 发表于: 2011-03-22
引用第3楼aishang于2011-03-22 14:43发表的  :
你说的这个我也上网上看了。这个是代码!
#include <QApplication>
#include <QLineEdit>
#include <qDebug>
#include <QTime>
.......

声明ImageDelegate类的QProgressBar类型的对象,调用setRange函数设置变化的范围,然后通过信号和槽机制触发QProgressBar对象调用setValue函数设置当前进度条的值 这样进度条就可以发生变化
离线XChinux

只看该作者 5楼 发表于: 2011-03-22
第一种方法,也是首选的:使用ItemDelegate类来自己绘制(参考ProgressBar的paintEvent()函数)。
第二种方法:调用setIndexWidget(new QProgressBar())
二笔 openSUSE Vim N9 BB10 XChinux@163.com 网易博客 腾讯微博
承接C++/Qt、Qt UI界面、PHP及预算报销系统开发业务
离线aishang
只看该作者 6楼 发表于: 2011-03-23
回 4楼(wxj120bw) 的帖子
谢谢指点!问题还在纠结中!
离线wxj120bw

只看该作者 7楼 发表于: 2011-03-23
你可以考虑版主的建议
离线aishang
只看该作者 8楼 发表于: 2011-03-23
回 5楼(XChinux) 的帖子
我用了全局变量也可以改变进度条的值
volatile int value = 0;
class ImageDelegate : public QItemDelegate
{


public:
    ImageDelegate(QObject *parent = 0):QItemDelegate(parent){};
    QWidget *createEditor(QWidget *parent, const QStyleOptionViewItem &option,
        const QModelIndex &index) const
    {
        QProgressBar *progress = new QProgressBar(parent);
        progress->setValue(value);
        progress->reset();
        return progress;
    }
};可是又有问题出现了。我的treewidget显示的时候需要刷新。我用了QHash来做的。就是比较第一列的,更新第二列(也就是进度条)。
QHash<QByteArray,QTreeWidgetItem *> hash;
QTreeWidget *tree;
QTreeWidgetItem *ReaderName;
QTreeWidgetItem *Tag_N1;
int Thread::dispose(QByteArray Tag_data)
{
    int all;
    QByteArray Tag_name;
    unsigned char percent;
    QHashIterator<QByteArray,QTreeWidgetItem *> relate(hash);
    tree->setItemDelegate(new ImageDelegate(tree));
      for(all = 0;all <Tag_data.length();all++)
    {
        if(Tag_data.at(all+4) == 0)
        {
            all = all + Tag_data.at(all +2)-1;
        }
        else
        if(Tag_data.at(all+4) > 0)
        {
            Tag_name = Tag_data.mid((all + 12),12);
            unsigned char temp =Tag_data.at((all + 5));
            percent = temp*100/255;
            all = all + Tag_data.at(all +2)-1;
            if(hash.isEmpty())
            {
                 hash.insert(Tag_name.toHex(),Tag_N1);
                 Tag_N1 = new QTreeWidgetItem(tree,QStringList(Tag_name.toHex()));
                 tree->openPersistentEditor(Tag_N1,1);
                 value = percent;
                 //Tag_N1->setText(1,QString::number(percent)+"%");
            }
            int size = 1;
            while (relate.hasNext())
            {
               relate.next();
               if(relate.key() == Tag_name.toHex())
               {
                   //relate.value()->setText(1,QString::number(percent)+"%");
                   value = percent;
                   tree->openPersistentEditor(relate.value(),1);
                   qDebug() <<value;
                   break;
               }
               if(relate.key() != Tag_name.toHex())
               {
                   if(hash.size() == size)
                   {
                        hash.insert(Tag_name.toHex(),Tag_N1);
                        Tag_N1 = new QTreeWidgetItem(tree,QStringList(Tag_name.toHex()));          
                        tree->openPersistentEditor(Tag_N1,1);
                        value = percent;
                        //Tag_N1->setText(1,QString::number(percent)+"%");
                   }
               }size++;
            }
         }
     }
     return 1;
}现在问题是进度条只能改变一次,我看过value = percent的qDebug(),它是变化的。不指点进度条为什么不跟着变化。还有hash也有点问题,每次跟新第一条记录的时候就出内存错误。我用
//Tag_N1->setText(1,QString::number(percent)+"%");显示第二列的时候这个值是可以更新的,但是就会出内存错误,如果我这样
            if(hash.isEmpty())
            {
                 hash.insert(P_Null.toHex(),Tag_N1);
                 Tag_N1 = new QTreeWidgetItem(tree,QStringList(Tag_name.toHex()));
                 tree->openPersistentEditor(Tag_N1,1);
                 value = percent;
                 //Tag_N1->setText(1,QString::number(percent)+"%");
            }先给hash插入一个不相关的数据的时候就不会出错。但会重复显示一条信息。
离线aishang
只看该作者 9楼 发表于: 2011-03-23
回 7楼(wxj120bw) 的帖子
你们说的我看的云里雾里的,版主说的要咋样实现呢?大哥具体点嘛!谢谢!小弟菜鸟啊!
快速回复
限100 字节
 
上一个 下一个