[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

Bug#483790: libqt4: QTreeWidgetItemIterator QT4.4 regression



Package: libqt4-gui
Version: 4.4.0~rc1-5
Severity: normal

Hi all,

I've seen an incorrect behaviour in my application ever since QT4.4 was
uploaded
to unstable.  I've created a minimal test case to demonstrate the problem
- I think
the root of the issue is in the QTreeWidgetItemIterator class.  The test
program
creates a QTreeWidget, sets "extended" selection mode, and attempts to
maintain
a bit of state about whether anything is selected at all (treeSelected
variable) and
a pointer to the treeWidgetItem if only one item is selected
(treeSingleSelection).

If you run the test program and select one item, you will see the state is
wrong
right away.  If you then select a different item, it corrects itself.  If
you unselect
the item, its incorrect again.

Hope you guys can get this fixed soon (or point out the problem in my test
case,
I'm happy to be shown its wrong!), as my app now has major problems without
this functionality.  This test case works as expected under all versions
of QT4.3
that I've used (since 4.3.1).

Thanks!

--
Nathan

16:41 nathans@verge ~/treeiterators 13> ls
main.cpp  main.h  test.cpp  test.h  test.pro
16:41 nathans@verge ~/treeiterators 14> cat test.pro
TEMPLATE        = app
LANGUAGE        = C++
HEADERS         = test.h main.h
SOURCES         = test.cpp main.cpp
CONFIG          += qt warn_on debug
16:41 nathans@verge ~/treeiterators 15> cat test.h
#include <QTreeWidget>
#include <QTreeWidgetItem>

class TestTree : public QTreeWidget
{
    Q_OBJECT
public:
    TestTree(QWidget *parent = 0);
public slots:
    void itemSelectionChanged();
private:
    bool treeSelected;
    QTreeWidgetItem *treeSingleSelection;
};
16:41 nathans@verge ~/treeiterators 16> cat main.h
#include <QMainWindow>

class TestTree;

class MainWindow : public QMainWindow
{
    Q_OBJECT
public:
    MainWindow();
private:
    TestTree *treeWidget;
};
16:41 nathans@verge ~/treeiterators 17> cat test.cpp
#include "test.h"
#include <QStringList>

TestTree::TestTree(QWidget *parent)
    : QTreeWidget(parent), treeSelected(false), treeSingleSelection(NULL)
{
    setColumnCount(1);
    setSelectionMode(QAbstractItemView::ExtendedSelection);
    QList<QTreeWidgetItem *> items;
    for (int i = 0; i < 10; i++) {
        QTreeWidgetItem *test = new QTreeWidgetItem((QTreeWidget*)0,
QStringList(QString("item: %1").arg(i)));
        items.append(test);
        fprintf(stderr, "ctor added tree item: %p\n", test);
    }
    insertTopLevelItems(0, items);

    connect(this, SIGNAL(itemSelectionChanged()), this,
SLOT(itemSelectionChanged()));

    fprintf(stderr, "ctor end: treeSingleSelection=%p treeSelected=%s\n",
        treeSingleSelection, treeSelected ? "true" : "false");
}

void TestTree::itemSelectionChanged()
{
    QTreeWidgetItemIterator iterator(this,
QTreeWidgetItemIterator::Selected);

    fprintf(stderr, "start: treeSingleSelection=%p treeSelected=%s\n",
        treeSingleSelection, treeSelected ? "true" : "false");

    treeSingleSelection = *iterator;
    if ((treeSelected = (treeSingleSelection != NULL)))
        if (*(++iterator) != NULL)
            treeSingleSelection = NULL;  // multiple selections

    fprintf(stderr, "end: treeSingleSelection=%p treeSelected=%s\n",
        treeSingleSelection, treeSelected ? "true" : "false");
}
16:41 nathans@verge ~/treeiterators 18> cat main.cpp
#include <QApplication>
#include <QMainWindow>
#include "test.h"
#include "main.h"

MainWindow::MainWindow() : QMainWindow()
{
    treeWidget = new TestTree();
    setCentralWidget(treeWidget);
    setWindowTitle(tr("Tree Widget Selection Test"));
    resize(200, 200);
}

int main(int argc, char **argv)
{
    QApplication app(argc, argv);
    MainWindow mainWin;
    mainWin.show();
    return app.exec();
}
16:41 nathans@verge ~/treeiterators 19>






Reply to: