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