Hi all,

I'm trying to set up a QItemDelegate that shows a QComboBox as its editor and 
manages non-primitives internally. I modified the StarDelegate example so that 
it uses QComboBoxes for editors and works with java.awt.Point as "complex" 
objects. Unfortunately the table data never changes. However, if I use 
primitives instead it works perfectly fine. I just don't get it.
Can please anyone explain to me what I am doing wrong here?

Thanks in advance for any hints,

Curt

Here are my running examples. I'm using qtjambi-win32-gpl-4.4.0_01 running 
under Windows XP.
- ComboBoxDelegateTest uses java.awt.Point and seemingly doesn't work 
correctly; 
- ComboBoxDelegateTest2 uses java.lang.Double and works just fine.


import java.awt.Point;
import java.util.LinkedList;

import com.trolltech.qt.core.QAbstractItemModel;
import com.trolltech.qt.core.QModelIndex;
import com.trolltech.qt.core.Qt;
import com.trolltech.qt.gui.QAbstractItemView;
import com.trolltech.qt.gui.QApplication;
import com.trolltech.qt.gui.QComboBox;
import com.trolltech.qt.gui.QGridLayout;
import com.trolltech.qt.gui.QIcon;
import com.trolltech.qt.gui.QItemDelegate;
import com.trolltech.qt.gui.QStyleOptionViewItem;
import com.trolltech.qt.gui.QTableWidget;
import com.trolltech.qt.gui.QTableWidgetItem;
import com.trolltech.qt.gui.QWidget;

/**
 * @author nowak
 */
public class ComboBoxDelegateTest extends QWidget
{
    private QTableWidget table;    
    private Object tableContent[][] = {
            { tr("Mass in B-Minor"), tr("Baroque"), tr("JS Bach"),
              new Point(0,0) },
            { tr("Sex Bomb"), tr("Pop"), tr("Tom Jones"), new Point(0,0) },
            { tr("Three More Foxes"), tr("jazz"), tr("Maynard Ferguson"),
                new Point(0,0) },
            { tr("Barbie Girl"), tr("Pop"), tr("Aqua"), new Point(0,0) }
        };
    

    public ComboBoxDelegateTest() {
        this(null);
    }

    public ComboBoxDelegateTest(QWidget parent)
    {
        super(parent);
        createTable();

        QGridLayout layout = new QGridLayout();
        layout.addWidget(table, 0, 0);
        setLayout(layout);
        setWindowTitle(tr("Star Delegate"));
        setWindowIcon(new QIcon("classpath:com/trolltech/images/qt-logo.png"));

        setMinimumSize(550, 200);
    }


    public void createTable()
    {
        LinkedList<String> headers = new LinkedList<String>();

        table = new QTableWidget(4, 4);

        table.setItemDelegate(new ComboBoxDelegate(table));        
        

        table.setEditTriggers(QAbstractItemView.EditTrigger.DoubleClicked,
                              QAbstractItemView.EditTrigger.SelectedClicked);
        table.setSelectionBehavior(
            QAbstractItemView.SelectionBehavior.SelectRows);

        headers.add(tr("Title"));
        headers.add(tr("Genre"));
        headers.add(tr("Artist"));
        headers.add(tr("Rating"));
        table.setHorizontalHeaderLabels(headers);

        for (int i = 0; i < tableContent.length; i++) {
            table.setItem(i, 0,
                new QTableWidgetItem((String) tableContent[i][0]));
            table.setItem(i, 1,
                new QTableWidgetItem((String) tableContent[i][1]));
            table.setItem(i, 2,
                new QTableWidgetItem((String) tableContent[i][2]));

            QTableWidgetItem rRating = new QTableWidgetItem();
            rRating.setData(Qt.ItemDataRole.DisplayRole, tableContent[i][3]);
            table.setItem(i, 3, rRating);
        }

        table.resizeColumnsToContents();
    }


    class ComboBoxDelegate extends QItemDelegate
    {
        public ComboBoxDelegate(QWidget parent)
        {
            super(parent);
        }

        
        @Override
        public QWidget createEditor(QWidget parent, QStyleOptionViewItem item,
                                    QModelIndex index)
        {
            Object data = index.data();
            if (data instanceof Point){
                QComboBox cb = new QComboBox(parent);
                cb.addItem("Point 1", new Point(1,1));
                cb.addItem("Point 2", new Point(2,1));
                cb.addItem("Point 3", new Point(9,2));
                cb.addItem("Point 4", new Point(4,10));
                return cb;
            }
            else
                return super.createEditor(parent, item, index);
        }


        @Override
        public void setModelData(QWidget editor, QAbstractItemModel model,
                                 QModelIndex index)
        {
            if(index.data() instanceof Point){
                QComboBox cb = (QComboBox) editor;
                int currentIndex = cb.currentIndex();
                Point cbPoint = (Point) cb.itemData(currentIndex);
                
                boolean hasSetData = model.setData(index, cbPoint);             
   // always true
                Object o1 = model.data(index);
                boolean isEqual = cbPoint.equals(o1);                           
 // always false
                
//                if(!isEqual){
//                    throw new IllegalStateException("Why is the cbPoint not 
inserted correctly??");
//                }
            }
            else
                super.setModelData(editor, model, index);
        }
    }

    public static void main(String args[])
    {
        QApplication.initialize(args);

        QWidget widget = new ComboBoxDelegateTest();
        widget.show();
        widget.resize(470, 200);

        QApplication.exec();
    }
}
// ++++++++++++++++++++++++++++++++++++++   END of example1  
+++++++++++++++++++++++++++++++++++++++

 

import java.util.LinkedList;

import com.trolltech.qt.core.QAbstractItemModel;
import com.trolltech.qt.core.QModelIndex;
import com.trolltech.qt.core.Qt;
import com.trolltech.qt.gui.QAbstractItemView;
import com.trolltech.qt.gui.QApplication;
import com.trolltech.qt.gui.QComboBox;
import com.trolltech.qt.gui.QGridLayout;
import com.trolltech.qt.gui.QIcon;
import com.trolltech.qt.gui.QItemDelegate;
import com.trolltech.qt.gui.QStyleOptionViewItem;
import com.trolltech.qt.gui.QTableWidget;
import com.trolltech.qt.gui.QTableWidgetItem;
import com.trolltech.qt.gui.QWidget;

/**
 * @author nowak
 */
public class ComboBoxDelegateTest2 extends QWidget
{
    private QTableWidget table;    
    private Object tableContent[][] = {
            { tr("Mass in B-Minor"), tr("Baroque"), tr("JS Bach"),
              new Double(-1.0) },
            { tr("Sex Bomb"), tr("Pop"), tr("Tom Jones"), new Double(-1.0) },
            { tr("Three More Foxes"), tr("jazz"), tr("Maynard Ferguson"),
                new Double(-1.0) },
            { tr("Barbie Girl"), tr("Pop"), tr("Aqua"), new Double(-1.0) }
        };
    

    public ComboBoxDelegateTest2() {
        this(null);
    }

    public ComboBoxDelegateTest2(QWidget parent)
    {
        super(parent);
        createTable();

        QGridLayout layout = new QGridLayout();
        layout.addWidget(table, 0, 0);
        setLayout(layout);
        setWindowTitle(tr("Star Delegate"));
        setWindowIcon(new QIcon("classpath:com/trolltech/images/qt-logo.png"));

        setMinimumSize(550, 200);
    }


    public void createTable()
    {
        LinkedList<String> headers = new LinkedList<String>();

        table = new QTableWidget(4, 4);

        table.setItemDelegate(new ComboBoxDelegate(table));        
        

        table.setEditTriggers(QAbstractItemView.EditTrigger.DoubleClicked,
                              QAbstractItemView.EditTrigger.SelectedClicked);
        table.setSelectionBehavior(
            QAbstractItemView.SelectionBehavior.SelectRows);

        headers.add(tr("Title"));
        headers.add(tr("Genre"));
        headers.add(tr("Artist"));
        headers.add(tr("Rating"));
        table.setHorizontalHeaderLabels(headers);

        for (int i = 0; i < tableContent.length; i++) {
            table.setItem(i, 0,
                new QTableWidgetItem((String) tableContent[i][0]));
            table.setItem(i, 1,
                new QTableWidgetItem((String) tableContent[i][1]));
            table.setItem(i, 2,
                new QTableWidgetItem((String) tableContent[i][2]));

            QTableWidgetItem rRating = new QTableWidgetItem();
            rRating.setData(Qt.ItemDataRole.DisplayRole, tableContent[i][3]);
            table.setItem(i, 3, rRating);
        }

        table.resizeColumnsToContents();
    }


    class ComboBoxDelegate extends QItemDelegate
    {
        public ComboBoxDelegate(QWidget parent)
        {
            super(parent);
        }

        
        @Override
        public QWidget createEditor(QWidget parent, QStyleOptionViewItem item,
                                    QModelIndex index)
        {
            Object data = index.data();
            if (data instanceof Double){
                QComboBox cb = new QComboBox(parent);
                cb.addItem("Double 0", new Double(0));
                cb.addItem("Double 2", new Double(2));
                cb.addItem("Double 9", new Double(9));
                cb.addItem("Double 100", new Double(100));
                return cb;
            }
            else
                return super.createEditor(parent, item, index);
        }


        @Override
        public void setModelData(QWidget editor, QAbstractItemModel model,
                                 QModelIndex index)
        {
            if(index.data() instanceof Double){
                QComboBox cb = (QComboBox) editor;
                int currentIndex = cb.currentIndex();
                Double cbDouble = (Double) cb.itemData(currentIndex);
                
                boolean hasSetData = model.setData(index, cbDouble);            
// always true
                Object o1 = model.data(index);
                boolean isEqual = cbDouble.equals(o1);                          
  // always true!
                
//                if(!isEqual){
//                    throw new IllegalStateException("Why is the cbDouble not 
inserted correctly??");
//                }
            }
            else
                super.setModelData(editor, model, index);
        }
    }

    public static void main(String args[])
    {
        QApplication.initialize(args);

        QWidget widget = new ComboBoxDelegateTest2();
        widget.show();
        widget.resize(470, 200);

        QApplication.exec();
    }
}




_______________________________________________
Qt-jambi-interest mailing list
[email protected]
http://lists.trolltech.com/mailman/listinfo/qt-jambi-interest

Reply via email to