QT的MVC(View/Delegate)模型十分强大,可以利用各种控件来对表格的输入进行限制,不过我以前一直没有过,这几天研究了一下,写个小例子,希望大家喜欢。

如果看不懂这个例子,请先看QT的自带例子:http://qt-project.org/doc/qt-4.8/itemviews-spinboxdelegate.html

思路:

1:为每一列定义委托:
A:第一列是编号列,使用只读委托,令该列的单元格是只读的
B:第三列是ID列,只能输入1-12个数字,利用QLineEdit委托和正则表达式对输入进行限制
C:第四年龄列,利用QSpinBox委托进行输入限制,只能输入1-100之间的数字
D:第五列是性别列,利用QComboBox委托对输入进行限制,该列的单元格只能输入Male或Female
E:第六列是头像列,在该列的单元格中央放置一张头像
2:定义代理类,把所有单元格中的字符居中显示。
3:利用QSS,将表格的背景色弄成黄蓝相间。

截图:

上代码:

  1. #include<QtGui>
  2. //编号列,只读委托
  3. //这个方法我还真想不到,呵呵
  4. classReadOnlyDelegate:publicQItemDelegate
  5. {
  6. Q_OBJECT
  7. public:
  8. ReadOnlyDelegate(QObject*parent=0):QItemDelegate(parent){}
  9. QWidget*createEditor(QWidget*parent,constqstyleOptionViewItem&option,
  10. constQModelIndex&index)const
  11. {
  12. returnNULL;
  13. }
  14. };
  15. //ID列,只能输入1-12个数字
  16. //利用QLineEdit委托和正则表达式对输入进行限制
  17. classUserIDDelegate:publicQItemDelegate
  18. {
  19. Q_OBJECT
  20. public:
  21. UserIDDelegate(QObject*parent=0):QItemDelegate(parent){}
  22. QWidget*createEditor(QWidget*parent,
  23. constQModelIndex&index)const
  24. {
  25. QLineEdit*editor=newQLineEdit(parent);
  26. QRegExpregExp("[0-9]{0,10}");
  27. editor->setValidator(newQRegExpValidator(regExp,parent));
  28. returneditor;
  29. }
  30. voidsetEditorData(QWidget*editor,constQModelIndex&index)const
  31. {
  32. QStringtext=index.model()->data(index,Qt::EditRole).toString();
  33. QLineEdit*lineEdit=static_cast<QLineEdit*>(editor);
  34. lineEdit->setText(text);
  35. }
  36. voidsetModelData(QWidget*editor,qabstractitemmodel*model,
  37. constQModelIndex&index)const
  38. {
  39. QLineEdit*lineEdit=static_cast<QLineEdit*>(editor);
  40. QStringtext=lineEdit->text();
  41. model->setData(index,text,Qt::EditRole);
  42. }
  43. voidupdateEditorGeometry(QWidget*editor,
  44. constqstyleOptionViewItem&option,constQModelIndex&index)const
  45. {
  46. editor->setGeometry(option.rect);
  47. }
  48. };
  49. //年龄列,利用QSpinBox委托进行输入限制,只能输入1-100之间的数字
  50. classAgeDelegate:publicQItemDelegate
  51. {
  52. Q_OBJECT
  53. public:
  54. AgeDelegate(QObject*parent=0):QItemDelegate(parent){}
  55. QWidget*createEditor(QWidget*parent,
  56. constQModelIndex&index)const
  57. {
  58. QSpinBox*editor=newQSpinBox(parent);
  59. editor->setMinimum(1);
  60. editor->setMaximum(100);
  61. returneditor;
  62. }
  63. voidsetEditorData(QWidget*editor,constQModelIndex&index)const
  64. {
  65. intvalue=index.model()->data(index,Qt::EditRole).toInt();
  66. QSpinBox*spinBox=static_cast<QSpinBox*>(editor);
  67. spinBox->setValue(value);
  68. }
  69. voidsetModelData(QWidget*editor,
  70. constQModelIndex&index)const
  71. {
  72. QSpinBox*spinBox=static_cast<QSpinBox*>(editor);
  73. spinBox->interpretText();
  74. intvalue=spinBox->value();
  75. model->setData(index,value,Qt::EditRole);
  76. }
  77. voidupdateEditorGeometry(QWidget*editor,
  78. constqstyleOptionViewItem&option,constQModelIndex&index)const
  79. {
  80. editor->setGeometry(option.rect);
  81. }
  82. };
  83. //性别列,利用QComboBox委托对输入进行限制
  84. //这一列的单元格只能输入Male或Female
  85. classSexDelegate:publicQItemDelegate
  86. {
  87. Q_OBJECT
  88. public:
  89. SexDelegate(QObject*parent=0):QItemDelegate(parent){}
  90. QWidget*createEditor(QWidget*parent,
  91. constQModelIndex&index)const
  92. {
  93. QComboBox*editor=newQComboBox(parent);
  94. editor->addItem("Female");
  95. editor->addItem("Male");
  96. returneditor;
  97. }
  98. voidsetEditorData(QWidget*editor,Qt::EditRole).toString();
  99. QComboBox*comboBox=static_cast<QComboBox*>(editor);
  100. inttindex=comboBox->findText(text);
  101. comboBox->setCurrentIndex(tindex);
  102. }
  103. voidsetModelData(QWidget*editor,
  104. constQModelIndex&index)const
  105. {
  106. QComboBox*comboBox=static_cast<QComboBox*>(editor);
  107. QStringtext=comboBox->currentText();
  108. model->setData(index,constQModelIndex&index)const
  109. {
  110. editor->setGeometry(option.rect);
  111. }
  112. };
  113. //头像列,只是在单元格中央放一张小图而已
  114. classIconDelegate:publicQItemDelegate
  115. {
  116. Q_OBJECT
  117. public:
  118. IconDelegate(QObject*parent=0):QItemDelegate(parent){}
  119. voidpaint(QPainter*painter,
  120. constQModelIndex&index)const
  121. {
  122. //show.bmp是在工程目录中的一张图片(其实就是QQ的图标啦,呵呵)
  123. Qpixmappixmap=Qpixmap("show.bmp").scaled(24,24);
  124. qApp->style()->drawItempixmap(painter,option.rect,Qt::AlignCenter,Qpixmap(pixmap));
  125. }
  126. };
  127. //代理类,把所有单元格中的字符居中显示
  128. classVIPModel:publicQStandardItemmodel
  129. {
  130. Q_OBJECT
  131. public:
  132. VIPModel(QObject*parent=NULL):QStandardItemmodel(parent){}
  133. VIPModel(introw,intcolumn,QObject*parent=NULL)
  134. :QStandardItemmodel(row,column,parent){}
  135. QVariantdata(constQModelIndex&index,introle=Qt::displayRole)const
  136. {
  137. if(Qt::TextAlignmentRole==role)
  138. returnQt::AlignCenter;
  139. returnQStandardItemmodel::data(index,role);
  140. }
  141. };
  142. #include"main.moc"
  143. intmain(intargc,char*argv[])
  144. {
  145. QApplicationapp(argc,argv);
  146. VIPModel*model=newVIPModel(5,5);
  147. QTableView*tableView=newQTableView;
  148. //把表格的背景调成黄蓝相间
  149. //这种方法是在网上看到的,用起来还真方便啊
  150. tableView->setAlternatingRowColors(true);
  151. tableView->setStyleSheet("QTableView{background-color:rgb(250,115);"
  152. "alternate-background-color:rgb(141,163,215);}");
  153. tableView->setwindowTitle("VIPList");
  154. tableView->resize(700,400);
  155. tableView->setModel(model);
  156. QStringListheaderList;
  157. headerList<<"No."<<"ID"<<"Name"<<"Age"<<"Sex"<<"Show";
  158. model->setHorizontalHeaderLabels(headerList);
  159. tableView->verticalHeader()->setVisible(false);
  160. tableView->horizontalHeader()->setStretchLastSection(true);
  161. //为每一列加载委托
  162. ReadOnlyDelegatereadOnlyDelegate;
  163. tableView->setItemDelegateForColumn(0,&readOnlyDelegate);
  164. UserIDDelegateuserIDDelegate;
  165. tableView->setItemDelegateForColumn(1,&userIDDelegate);
  166. AgeDelegatespinBoxDelegate;
  167. tableView->setItemDelegateForColumn(3,&spinBoxDelegate);
  168. SexDelegatecomboBoxDelegate;
  169. tableView->setItemDelegateForColumn(4,&comboBoxDelegate);
  170. IconDelegateiconDelegate;
  171. tableView->setItemDelegateForColumn(5,&iconDelegate);
  172. for(inti=0;i<10;i++)
  173. {
  174. QModelIndexindex=model->index(i,QModelIndex());
  175. model->setData(index,i);
  176. }
  177. tableView->show();
  178. returnapp.exec();
  179. }

转自:http://www.linuxidc.com/Linux/2012-07/66820.htm

QT:在QTableView中使用各种自定义委托的更多相关文章

  1. html5教你做炫酷的碎片式图片切换 (canvas)

    本篇文章主要介绍了html5教你做炫酷的碎片式图片切换 (canvas) ,具有一定参考价值,有兴趣的可以了解一下

  2. Html5 Canvas实现图片标记、缩放、移动和保存历史状态功能 (附转换公式)

    这篇文章主要介绍了Html5 Canvas实现图片标记、缩放、移动和保存历史状态功能 (附转换公式),本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下

  3. HTML5仿微信聊天界面、微信朋友圈实例代码

    小编最近开发一个基于html5开发的一个微信聊天前端界面,功能很全面,下面小编给大家分享实例代码,需要的朋友参考下

  4. ios – 如何将UICollectionViewCell从一个UICollectionView拖到另一个UICollectionView?

    如果是这样,我将如何实施它?

  5. xcode – 在自定义表视图单元格中嵌入集合视图

    我有一个故事板的图像,你可以看到自定义表格单元格然后底部是一个集合视图,我想填充图像–只是不知道如何?我也不确定哪些信息可能会有所帮助,所以如果有信息遗失,我很抱歉.解决方法您应该将UICollectionView的Delagate和DataSource放在自定义UITableViewCell类中.这是一个nicetutorial.它是关于tableview单元格中的tableview,但这个想法非常相似.祝好运!

  6. ios – 使用动态单元格高度时,将表格视图滚动到底部

    使用动态单元格高度时,如何将表格视图滚动到底部?出于某种原因,此代码在此方案中不起作用:谢谢!

  7. ios – 渲染模式设置为图像目录中的矢量pdf模板,但UIImageView不会在自定义单元格中设置图像

    我已将所有图像文件迁移到资产目录.所有这些都是大小为1x的pdf向量.它们设置为呈现为模板.它们在大小和颜色方面都显得很好.但是有一个来自xib的自定义TableViewCell,我有6个UIImageView链接到目录中的6个这些图像.不知何故,他们不尊重色调,既不是默认也不是自定义.尝试以编程方式更改它们,但也没有工作.这些相同的图像在主故事板内的静态单元格的另一个tableview中显示正常

  8. ios – 我的表视图在滚动时在SWIFT中重用所选单元格

    实例变量

  9. ios – 带图像而不是标题的UITableViewRowAction

    可以告诉我如何解决它,或者其他方式来做到这一点?

  10. iOS – 自定义表格单元格不是UITableView的全宽度

    我可能会犯这个错误.所以我创建了一个UITableView,它基本上有一个设置为主视图的自动布局尾随空间.我正在为这个表创建一个自定义单元格,所以我在原型单元格上进行了定制,定制了它,并为它创建了我的类.这一切都很好.我似乎无法解决的是自定义单元格不是实际表格单元格的全宽,因此只显示白色背景.如果我不使用自定义单元格,则可以使用整个宽度表单元格.我为单元格内容设置了约束,以便背景图像填充单元格.我究竟做错了什么?

随机推荐

  1. 法国电话号码的正则表达式

    我正在尝试实施一个正则表达式,允许我检查一个号码是否是一个有效的法国电话号码.一定是这样的:要么:这是我实施的但是错了……

  2. 正则表达式 – perl分裂奇怪的行为

    PSperl是5.18.0问题是量词*允许零空间,你必须使用,这意味着1或更多.请注意,F和O之间的空间正好为零.

  3. 正则表达式 – 正则表达式大于和小于

    我想匹配以下任何一个字符:或=或=.这个似乎不起作用:[/]试试这个:它匹配可选地后跟=,或者只是=自身.

  4. 如何使用正则表达式用空格替换字符之间的短划线

    我想用正则表达式替换出现在带空格的字母之间的短划线.例如,用abcd替换ab-cd以下匹配字符–字符序列,但也替换字符[即ab-cd导致d,而不是abcd,因为我希望]我如何适应以上只能取代–部分?

  5. 正则表达式 – /bb | [^ b] {2} /它是如何工作的?

    有人可以解释一下吗?我在t-shirt上看到了这个:它似乎在说:“成为或不成为”怎么样?我好像没找到’e’?

  6. 正则表达式 – 在Scala中验证电子邮件一行

    在我的代码中添加简单的电子邮件验证,我创建了以下函数:这将传递像bob@testmymail.com这样的电子邮件和bobtestmymail.com之类的失败邮件,但是带有空格字符的邮件会漏掉,就像bob@testmymail也会返回true.我可能在这里很傻……当我测试你的正则表达式并且它正在捕捉简单的电子邮件时,我检查了你的代码并看到你正在使用findFirstIn.我相信这是你的问题.findFirstIn将跳转所有空格,直到它匹配字符串中任何位置的某个序列.我相信在你的情况下,最好使用unapp

  7. 正则表达式对小字符串的暴力

    在测试小字符串时,使用正则表达式会带来性能上的好处,还是会强制它们更快?不会通过检查给定字符串的字符是否在指定范围内比使用正则表达式更快来强制它们吗?

  8. 正则表达式 – 为什么`stoutest`不是有效的正则表达式?

    isthedelimiter,thenthematch-only-onceruleof?PATTERN?

  9. 正则表达式 – 替换..与.在R

    我怎样才能替换..我尝试过类似的东西:但它并不像我希望的那样有效.尝试添加fixed=T.

  10. 正则表达式 – 如何在字符串中的特定位置添加字符?

    我正在使用记事本,并希望使用正则表达式替换在字符串中的特定位置插入一个字符.例如,在每行的第6位插入一个逗号是什么意思?如果要在第六个字符后添加字符,请使用搜索和更换从技术上讲,这将用MatchGroup1替换每行的前6个字符,后跟逗号.

返回
顶部