• 11477阅读
  • 4回复

终于找到QListWidget功能使用比较完善的帖子了。。addItem和takeItem足矣 [复制链接]

上一主题 下一主题
离线iiiyyyhhhsss
 

只看楼主 倒序阅读 楼主  发表于: 2009-09-07
http://www.cppblog.com/biao/archive/2008/03/22/45087.aspx

他使用了takeItem来删除

而Item在两个ListWidget之间传递时,他没有用currentItem,而是仍然使用了takeItem,

我也验证过currentItem是不行的,但我暂时没有找到不行的原因。。。。。反正用takeItem就OK了




Qt: 创建List, 添加删除Item
#ifndef LISTWINDOW_H_
#define LISTWINDOW_H_

#include <QDialog>

class QPushButton;
class QListWidget;
class QWidget;

class ListWindow : public QDialog {
    Q_OBJECT
public:
    ListWindow(QWidget *parent = 0);
    virtual ~ListWindow();

public slots:
    void moveLeft();
    void moveRight();
    
private:
    QPushButton *moveLeftButton;
    QPushButton *moveRightButton;
    QListWidget *leftList;
    QListWidget *rightList;
};

#endif /**//*LISTWINDOW_H_*/

#include "ListWindow.h"
#include <QPushButton>
#include <QListWidget>
#include <QWidget>
#include <QHBoxLayout>
#include <QVBoxLayout>
#include <QGridLayout>
#include <QStringList>
#include <QListWidgetItem>

ListWindow::ListWindow(QWidget *parent) :
    QDialog(parent) {
    QGridLayout *gridLayout = new QGridLayout();
    gridLayout->addWidget(leftList = new QListWidget(), 0, 0, 3, 1);
    gridLayout->addWidget(moveLeftButton = new QPushButton("<<"), 0, 1, 1, 1);
    gridLayout->addWidget(moveRightButton = new QPushButton(">>"), 1, 1, 1, 1);
    gridLayout->addWidget(rightList = new QListWidget(), 0, 2, 3, 1);
    
    QObject::connect(moveLeftButton, SIGNAL(clicked()), this, SLOT(moveLeft()));
    QObject::connect(moveRightButton, SIGNAL(clicked()), this, SLOT(moveRight()));
    
    QStringList items;
    items << "One" << "Two" << "Three" << "Four" << "Five" << "Sechs"
            << "Sieben" << "One" << "Two" << "Three" << "Four" << "Five"
            << "Sechs" << "Sieben";
    leftList->addItems(items);
    
    this->setLayout(gridLayout);
}

ListWindow::~ListWindow() {
}

void ListWindow::moveLeft() {
    //    if (rightList->currentItem() == 0) {
    //        return;
    //    }
    //    
    //    QString text = rightList->currentItem()->text();
    //    delete rightList->currentItem();
    //    leftList->addItem(text);
    
    // The takeItem() method is used to remove an Item form one list without
    // having to delete it. TakeItem() no deleting or no creating, more efficient.
    if (rightList->selectedItems().count() != 1) {
        return;
    }
    
    QListWidgetItem *item = rightList->takeItem(rightList->currentRow());
    leftList->addItem(item);
}

void ListWindow::moveRight() {
    //    if (leftList->currentItem() == 0) {
    //        return;
    //    }
    //    
    //    QString text = leftList->currentItem()->text();
    //    delete leftList->currentItem();
    //    rightList->addItem(text);

    if (leftList->selectedItems().count() != 1) {
        return;
    }
    
    QListWidgetItem *item = leftList->takeItem(leftList->currentRow());
    rightList->addItem(item);
}
离线yj_yulin

只看该作者 1楼 发表于: 2009-09-08
数据量大的话请慎重使用QListWidget,使用model,view的方式会快得多,虽然qt的mvc确实也不怎么样
离线l_xin
只看该作者 2楼 发表于: 2009-09-08
void ProjectListWidget::removeVideos(QList<QListWidgetItem*> deleteItems)
{

//    std::cout<<" click ok "<<std::endl;
    if (!deleteItems.isEmpty())
    {
        for (int i = 0; i<deleteItems.size();i++)
           {
               this->takeItem(this->row(deleteItems.at(i)));
               itemNum--;
           }
     }

我是用takeItem删除的……还可以批量删除,用selectItem 和 takeItem 以及QListWidget::Row(int i) 做起来还是比较简单而且灵活的
离线jalor

只看该作者 3楼 发表于: 2009-09-08
楼主,你的问题解决了,好呆我也说对了一些些。
我的问题还在那呢?有时间的话帮我整整?我都浪费太多时间了,都已经被批了,哇哇……
问题在 你 那个求解的帖子里,6楼:

我在用QTreeWidget,
想实现 添加一个子 item 时,怎样判断是否有他的上一层属性的TopLevelItem存在?
比如,我要添加“王五”因为他是北京人,我得先在QTreeWidget判断是否有个名为“北京”的TopLevelItem
如果没有我将创建,有我就往那个TopLevelItem里面 addChild。

哪位大虾能告诉我怎样判断?
离线iiiyyyhhhsss

只看该作者 4楼 发表于: 2009-09-08
呵呵,是的,感谢你的回帖。。。

我在manul里找到这句
Adding the same QListWidgetItem multiple times to a QListWidget will result in undefined behavior.

因此我觉得你不用先判断是否有“北京”的存在啊,先直接添加一个“北京”,再添加你的“王五”啊....

如果它原来有北京的话,那么你那步添加“北京”,应该是不起作用的。。。

你试试看。。。
快速回复
限100 字节
 
上一个 下一个