请问如何设置QTABLEVIEW表格的编辑焦点?

glosing 2013-11-22 10:50:47
我要实现如下功能,在QTABLEVIEW生成的表格里面双击某个EDIT输入数据,然后在点别的地方的时候这个VIEW的model会判断下输入的数据合不合法,如果不合法,则要让输入的焦点光标继续回到我刚才编辑的那个EDIT要求继续输入,直到所输入的数据合法则成功了。
请问如何实现?多谢您。
...全文
565 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
glosing 2013-11-22
  • 打赏
  • 举报
回复
我在delegate里面的setModelData里面这样子行不行的
void TableDelegate::setModelData(QWidget *editor, QAbstractItemModel *model,
									 const QModelIndex &index) const
{
	QString tempsvalue = index.model()->data(index,Qt::DisplayRole).toString();//原来里面的值。
	QString svalue;//现在要写到MODEL里面的值
	if (index.column()>=1)
	{
		
		switch(cur_tabledata->GetColAttr(index.column()))
		{
		case GL_ATTR_EDIT:
		case GL_ATTR_NUMEDIT:
		case GL_ATTR_NUMEDIT_DOUBLE:
			{
				
				QLineEdit *lineEdit = static_cast<QLineEdit*>(editor);
				svalue=lineEdit->text();
				break;
			}
		case GL_ATTR_COMBOBOX:
			{		
				
				QComboBox *comboBox = static_cast<QComboBox*>(editor);
				svalue = comboBox->currentText();
				break;
			}
		}	
		//2013.11.22 
		if (judge(svalue))//如果不合法则返回TRUE
		{		
 			editor->setFocus();
 			editor->show();
			return;
		}
		model->setData(index, svalue, Qt::EditRole);
	}
	else
		QItemDelegate::setModelData(editor, model, index);
}
这样老是不行啊。
引用 7 楼 LazyDreamHunter 的回复:
再通过setFocus重新将焦点定位到QLineEdit
RabinSong 2013-11-22
  • 打赏
  • 举报
回复
再通过setFocus重新将焦点定位到QLineEdit
RabinSong 2013-11-22
  • 打赏
  • 举报
回复
1.最好是派生QLineEdit,重载焦点离开事件,在焦点离开事件里做(focusLeaveEvent)。 2.如果你不想这样做的话,你就得重载QTableView的mousePressEvent,在该事件里判断是否有效。
glosing 2013-11-22
  • 打赏
  • 举报
回复
判断合法我可在model或者delegate里面取得输入的值判断下是否合法,如果不合法则不让其setData和setModelData,可是就是不能再设置编辑焦点了,郁闷。
引用 楼主 glosing 的回复:
我要实现如下功能,在QTABLEVIEW生成的表格里面双击某个EDIT输入数据,然后在点别的地方的时候这个VIEW的model会判断下输入的数据合不合法,如果不合法,则要让输入的焦点光标继续回到我刚才编辑的那个EDIT要求继续输入,直到所输入的数据合法则成功了。 请问如何实现?多谢您。
glosing 2013-11-22
  • 打赏
  • 举报
回复
就是说我已经有了delegate了,QLineEdit就是用的QT自带的那种,请问这种如何设置焦点啊,我试了好多方法都不行啊。
引用 1 楼 LazyDreamHunter 的回复:
void mousePressEvent(QMouseEvent *event) { QStyleOptionViewItem option; QModelIndex index = currentIndex(); if (index.isValid()) { int row = index.row(); int col = index.column(); index = model()->index(row, col); QAbstractItemDelegate *pDelegate = itemDelegate(); if (pWidget != NULL) { pWidget->hide(); } pWidget = pDelegate->createEditor(this, option, index); pWidget->setGeometry(100, y, 100, 30); pWidget->setFocus(); pWidget->show(); setCurrentIndex(index); } QTableView::mousePressEvent(event); } 重载createEditor,在里面创建CMyEdit,CMyEdit派生自QLineEdit 重载CMyEdit的焦点离开事件,在焦点离开事件里判断输入是否合法,不合法,则将焦点重新设为CMyEdit,方法通过setFocus成员方法。
glosing 2013-11-22
  • 打赏
  • 举报
回复
多谢多谢,我正在看你那个帖子的。 我已经有了TableDelegate啊,createEditor这个函数也已经写了。我现在是有三个类,共同实现一个table,TableDelegate,TableView,TableModel。
QWidget *TableDelegate::createEditor(QWidget *parent,
										 const QStyleOptionViewItem & option ,
										 const QModelIndex & index ) const
{
	if (index.column()>=1)
	{		
		switch(cur_tabledata->GetColAttr(index.column()))
		{
		case GL_ATTR_EDIT:
		case GL_ATTR_NUMEDIT:
		case GL_ATTR_NUMEDIT_DOUBLE:
			{			
				QLineEdit *editor = new QLineEdit(parent);		
				return editor;
			}
		case GL_ATTR_COMBOBOX:
			{
				
				QComboBox *combobox = new QComboBox(parent);
				QStringList strlist;
				cur_tabledata->m_MenuInfo.GetMenuAllString( index.column(), strlist );
				combobox->addItems(strlist);
				return combobox;
			}
			case GL_ATTR_SEARCH:
				{
					emit callSearch(index.row(),index.column());
					return 0;
				}
		}
		
	}
	else
		return QItemDelegate::createEditor(parent,option ,index);
}
RabinSong 2013-11-22
  • 打赏
  • 举报
回复
参考,http://bbs.csdn.net/topics/390644083
RabinSong 2013-11-22
  • 打赏
  • 举报
回复
void mousePressEvent(QMouseEvent *event) { QStyleOptionViewItem option; QModelIndex index = currentIndex(); if (index.isValid()) { int row = index.row(); int col = index.column(); index = model()->index(row, col); QAbstractItemDelegate *pDelegate = itemDelegate(); if (pWidget != NULL) { pWidget->hide(); } pWidget = pDelegate->createEditor(this, option, index); pWidget->setGeometry(100, y, 100, 30); pWidget->setFocus(); pWidget->show(); setCurrentIndex(index); } QTableView::mousePressEvent(event); } 重载createEditor,在里面创建CMyEdit,CMyEdit派生自QLineEdit 重载CMyEdit的焦点离开事件,在焦点离开事件里判断输入是否合法,不合法,则将焦点重新设为CMyEdit,方法通过setFocus成员方法。

16,215

社区成员

发帖
与我相关
我的任务
社区描述
Qt 是一个跨平台应用程序框架。通过使用 Qt,您可以一次性开发应用程序和用户界面,然后将其部署到多个桌面和嵌入式操作系统,而无需重复编写源代码。
社区管理员
  • Qt
  • 亭台六七座
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧