• 9530阅读
  • 3回复

关于QTableWidget自定义代理的问题 [复制链接]

上一主题 下一主题
离线liujia_310
 
只看楼主 正序阅读 楼主  发表于: 2009-04-09
我自己从QItemDelegate继承了一个EditorDelegate 代理
QWidget *EditorDelegate::createEditor(QWidget *parent, const QStyleOptionViewItem &option, const QModelIndex &index) const
{
  if(index.column() == 1)
    {
    QDateTimeEdit *editor = new QDateTimeEdit(parent);
    editor->setDisplayFormat("yyyy/M/dd");
    editor->setCalendarPopup(true);
    return editor;
  }
  else if(index.column() == 2)
  {
   QSpinBox *editor = new QSpinBox(parent);
   editor->setMinimum(140);
   editor->setMaximum(200);
   return editor;

  }
  else if(index.column() == 3)
  {
   QComboBox *editor = new QComboBox(parent);
   QStringList str;
   str<<tr("北京")<<tr("上海")<<tr("深圳");
   editor->addItems(str);
   return editor;

  }
  else
      return QItemDelegate::createEditor(parent,option,index);
}

void EditorDelegate::setEditorData(QWidget *editor, const QModelIndex &index) const
{
if(index.column() == 1)
    {
   QDateTimeEdit *dateEdit = qobject_cast<QDateTimeEdit *>(editor);
   if(dateEdit)
       dateEdit->setDate(QDate::fromString(index.model()->data(index,Qt::EditRole).toString(),"yyyy/M/d"));

}
else if(index.column() == 2)
{
  QSpinBox *spinEditor = qobject_cast<QSpinBox *>(editor);
  if(spinEditor)
      spinEditor->setValue(index.model()->data(index,Qt::EditRole).toInt());
}
else if(index.column() == 2)
{
     QComboBox *comboEditor = qobject_cast<QComboBox *>(editor);
     if(comboEditor)
     {
         int i = comboEditor->findText(index.model()->data(index,Qt::EditRole).toString());
     comboEditor->setCurrentIndex(i);
     }
}
else
     return QItemDelegate::setEditorData(editor,index);
}
...
...
...
.

在main函数中直接使用QTableWidget 能显示出数据代码如下:
但是我在设计器中添加一个QTableWidget  
然后再设置代理后却什么也显示不出来。请问这是什么原因???
int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
QTableWidget   tableWidget(4,4);
   EditorDelegate delegate;
   QStringList headers;
   headers<<QObject::tr("姓名")<<QObject::tr("出身日期")<<QObject::tr("身高")<<QObject::tr("籍贯");
   tableWidget.setHorizontalHeaderLabels(headers);
   tableWidget.setItemDelegate(&delegate);

   tableWidget.setItem(0,0,new QTableWidgetItem(QObject::tr("张1")));
   tableWidget.setItem(1,0,new QTableWidgetItem(QObject::tr("张2")));
   tableWidget.setItem(2,0,new QTableWidgetItem(QObject::tr("张3")));
   tableWidget.setItem(3,0,new QTableWidgetItem(QObject::tr("张4")));

   tableWidget.setItem(0,1,new QTableWidgetItem(QObject::tr("1986/6/6")));
   tableWidget.setItem(1,1,new QTableWidgetItem(QObject::tr("1985/5/5")));
   tableWidget.setItem(2,1,new QTableWidgetItem(QObject::tr("1987/8/8")));
   tableWidget.setItem(3,1,new QTableWidgetItem(QObject::tr("1949/10/1")));

   tableWidget.setItem(0,2,new QTableWidgetItem(QObject::tr("165")));
   tableWidget.setItem(1,2,new QTableWidgetItem(QObject::tr("170")));
   tableWidget.setItem(2,2,new QTableWidgetItem(QObject::tr("175")));
   tableWidget.setItem(3,2,new QTableWidgetItem(QObject::tr("180")));

   tableWidget.setItem(0,3,new QTableWidgetItem(QObject::tr("上海")));
   tableWidget.setItem(1,3,new QTableWidgetItem(QObject::tr("北京")));
   tableWidget.setItem(2,3,new QTableWidgetItem(QObject::tr("北京")));
   tableWidget.setItem(3,3,new QTableWidgetItem(QObject::tr("深圳")));

   tableWidget.show();
}
离线hhu_zhou

只看该作者 3楼 发表于: 2010-04-20
还需要setData()将editor中的信息设置到model中,其次你的main函数里为什么要一个一个设置item的代理呢?你的代理里的index不就包含了行index.row()和列index.column()的信息吗?可以通过index来设置你某一个item的角色或者属性
离线keyidadi
只看该作者 2楼 发表于: 2010-03-04
我感觉是它只代理了编辑方法,没有显示的方法。
离线keyidadi
只看该作者 1楼 发表于: 2010-03-04
同问
快速回复
限100 字节
 
上一个 下一个