本人也是刚学Qt不久,还比较菜,提一些意见,如果不对,还望大家批评指教:)。
1.我觉得这样做没什么不合理的地方,如果吹毛求屁点的话,QKeyEvent类的实例最好在stack内存块中分配,不要在heap内存分配,以防memory leak。
2.对QFont类还不太了解:(。
3.用QTableView和用QTableWidget本质上是一样的,我觉得使用QTableWidget已经能满足大部分应用的需要,不需要用到它的父类QTableView.
就楼主说的两种方法,我觉得第一种方法还是可取的,只不过用一个类来保存行列编辑器的信息,然后在createEdit函数遍历信息链表有点烦琐,有点杀鸡用牛刀的感觉,用一个枚举类型来表示你所要用到的编辑器就可以了。举个简单的例子吧(贪简便,直接用QTableWidget了):
MyTableWidget类的声明:
class MyTableWidget : public QTableWidget
{
public:
enum EditType{LineEdit=10,TextEdit,SpinBox,ComboBox,CheckBox};
MyTableWidget(QWidget *parent=0);
void addWidgetItem(int row,int col,EditType type);
QTableWidgetItem * itemFromIndex ( const QModelIndex & index ) const ;
};
Q_DECLARE_METATYPE(MyTableWidget::EditType)
MyTableWidget类的实现:
MyTableWidget::MyTableWidget(QWidget * parent):QTableWidget(parent)
{
setItemDelegate(new MyDelegate(this));
}
void MyTableWidget::addWidgetItem(int row,int col,MyTableWidget::EditType type)
{
QTableWidgetItem * item=new QTableWidgetItem();
item->setData(Qt::UserRole,type);
setItem(row,col,item);
openPersistentEditor(item);//是否一直打开编辑器视情况而定
}
QTableWidgetItem * MyTableWidget::itemFromIndex(const QModelIndex & index)const
{
return QTableWidget::itemFromIndex(index);
}
MyDelegate类的声明:
class MyDelegate:public QItemDelegate
{
public:
MyDelegate(QWidget *parent=0) : QItemDelegate(parent){};
QWidget * createEditor(QWidget * parent,const QStyleOptionViewItem & option,const QModelIndex & index)const;
};
MyDelegate类的实现:
QWidget * MyDelegate::createEditor(QWidget * parent,const QStyleOptionViewItem & option,const QModelIndex & index)const
{
MyTableWidget * myWidget=static_cast<MyTableWidget *>(this->parent());
if(myWidget==0)
return 0;
QTableWidgetItem *item=myWidget->itemFromIndex(index);
if(item==0)
return 0;
MyTableWidget::EditType type=(MyTableWidget::EditType)qvariant_cast<int>(item->data(Qt::UserRole));
switch(type)
{
case MyTableWidget::LineEdit :
return new QLineEdit(parent);
case MyTableWidget::SpinBox :
return new QSpinBox(parent);
case MyTableWidget::CheckBox :
return new QCheckBox(parent);
case MyTableWidget::TextEdit :
return new QTextEdit(parent);
case MyTableWidget::ComboBox :
return new QComboBox(parent);
}
return 0;
}
把主函数也写一下吧:)
int main(int argc,char *argv[ ])
{
QApplication app(argc,argv);
MyTableWidget m;
m.setColumnCount(2);
m.setRowCount(2);
m.addWidgetItem(0,0,MyTableWidget::SpinBox);
m.addWidgetItem(0,1,MyTableWidget::CheckBox);
m.addWidgetItem(1,0,MyTableWidget::ComboBox);
m.addWidgetItem(1,1,MyTableWidget::LineEdit);
m.show();
return app.exec();
}
[ 此贴被pfyang在2007-08-29 20:11重新编辑 ]