void CellTableView::cellDoubleClicked(StrId cell) { int idx = mDataSet->getCellIndex(cell); if (idx < 0) return; QModelIndex sindex = mModel->index(idx, 0); QModelIndex pindex = mProxyModel->mapFromSource(sindex); if (!pindex.isValid()) return; selectionModel()->select(pindex, QItemSelectionModel::ClearAndSelect|QItemSelectionModel::Rows); scrollTo(pindex); setFocus(Qt::ActiveWindowFocusReason); emit showInEditor(true); }
时间: 2024-04-19 21:28:57 浏览: 191
这段代码是一个双击表格单元格时的槽函数实现。首先,它通过`mDataSet->getCellIndex(cell)`方法获取指定单元格的索引`idx`,如果索引小于0,则直接返回。
然后,它使用`mModel->index(idx, 0)`方法获取源模型中的索引`sindex`,然后使用`mProxyModel->mapFromSource(sindex)`方法将该索引映射到代理模型中的索引`pindex`。如果`pindex`无效,则直接返回。
接下来,它使用`selectionModel()->select(pindex, QItemSelectionModel::ClearAndSelect|QItemSelectionModel::Rows)`方法选择指定的索引,并使用`scrollTo(pindex)`方法将该索引滚动到可见区域。然后,使用`setFocus(Qt::ActiveWindowFocusReason)`方法将焦点设置为活动窗口,并通过`emit showInEditor(true)`发射一个信号,通知其他部分将该单元格在编辑器中显示出来。
相关问题
void CellTableView::cellDoubleClicked(StrId cell) { int idx = mDataSet->getCellIndex(cell); if (idx < 0) return; QModelIndex sindex = mModel->index(idx, 0); QModelIndex pindex = mProxyModel->mapFromSource(sindex); if (!pindex.isValid()) return; selectionModel()->select(pindex, QItemSelectionModel::ClearAndSelect|QItemSelectionModel::Rows); scrollTo(pindex); setFocus(Qt::ActiveWindowFocusReason); emit showInEditor(true); }他要显示的数据在哪里
根据给出的代码,这段代码的目的是在双击单元格时显示相应的数据。显示的数据是通过从数据集(mDataSet)中获取单元格索引(cell)来确定的。然后,通过使用模型(mModel)和代理模型(mProxyModel)来获取对应的索引(pindex),并确保它是有效的。最后,通过选择该索引的行,并将其滚动到可见区域,实现了显示数据的效果。显示数据的具体方法可能在 emit showInEditor(true) 中实现,但根据给出的代码,无法确定具体的实现细节。
void CFindDlg::OnBnClickedButton1() { // TODO: 在此添加控件通知处理程序代码 m_Listbox.ResetContent(); //清空列表框的内容 CString name; //获取当前选中项 int index = m_comboName.GetCurSel(); //获取组合框当前内容 m_comboName.GetLBText(index, name); CInfoFile file; file.ReadDocline(); for (list<stu>::iterator it = file.ls.begin(); it != file.ls.end(); it++) { CStringA str; char* strname; str = name; //CString 转CStringA strname = str.GetBuffer();//CString 转为char * if (it->name == strname) { const char* szID = "学号:"; const char* szName = "姓名:"; const char* szAge = "年龄:"; const char* szGrade = "成绩:"; CString strID(szID), strName(szName), strAge(szAge), strGrade(szGrade); CString str; std::vector<CString> strList; str.Format(_T("%d"), it->id); strList.push_back(strID + str + _T("\r\n")); str = CString(it->name.c_str()); strList.push_back(strName + str + _T("\r\n")); str.Format(_T("%d"), it->age); strList.push_back(strAge + str + _T("\r\n")); str.Format(_T("%d"), it->grade); strList.push_back(strGrade + str + _T("\r\n")); for (int i = 0; i < strList.size(); i++) { m_Listbox.AddString(strList[i]); }}}}为什么输出在列表框的内容顺序倒过来了,第一个是成绩,最后一个是学号
这是因为在循环中添加字符串时,先将成绩的字符串添加到了列表框中,然后才是学号的字符串,导致了顺序倒过来。要解决这个问题,只需要将字符串的添加顺序改为先添加学号,再添加姓名、年龄和成绩即可。即将以下代码:
```
strList.push_back(strID + str + _T("\r\n"));
strList.push_back(strName + str + _T("\r\n"));
strList.push_back(strAge + str + _T("\r\n"));
strList.push_back(strGrade + str + _T("\r\n"));
```
改为:
```
strList.push_back(strGrade + str + _T("\r\n"));
strList.push_back(strAge + str + _T("\r\n"));
strList.push_back(strName + str + _T("\r\n"));
strList.push_back(strID + str + _T("\r\n"));
```
阅读全文