在QTableView中表格焦点问题

水军总督 2013-11-15 10:30:07
QStandardItemModel* model_2 = new QStandardItemModel;
model_2->setColumnCount(4);
model_2->setRowCount(2);

QStandardItem *item_2_00 = new QStandardItem(tr("时间"));
model_2->setItem(0,0,item_2_00);

QStandardItem *item_2_02 = new QStandardItem(tr("地点"));
model_2->setItem(0,2,item_2_02);
QStandardItem *item_2_10 = new QStandardItem(tr("人物"));
model_2->setItem(1,0,item_2_10);
QStandardItem *item_2_12 = new QStandardItem(tr("事件"));
model_2->setItem(1,2,item_2_12);
model_2->item(0,0)->setEditable(false);
model_2->item(0,2)->setEditable(false);
model_2->item(1,0)->setEditable(false);
model_2->item(1,2)->setEditable(false);

ui->tableView_2->setModel(model_2);
ui->tableView_2->verticalHeader()->hide();
ui->tableView_2->horizontalHeader()->hide();

代码如上,在tableView中建立表格后,是两行四个格的表,共八格。四格有字的不可编辑,四个无字的可编辑。
想实现在编辑其中一个无字的格子时,点击回车键,光标会移动到下一个无字表格。
...全文
1181 17 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
z55716368 2015-07-13
  • 打赏
  • 举报
回复
@RabinSong 前段时间一直在弄通信,现在还是回到这个问题,我写了一个回车事件,但是这个回车事件在打开这个界面时按下回车就会被触发。我想要的是当我在编辑某个界面中tableview的单元格时,回车触发。要怎么做呢
RabinSong 2015-05-11
  • 打赏
  • 举报
回复
1.重载QTbleview的keyEvent方法 void QTbleview::keyPressEvent(QKeyEvent *event) { int key = event->key(); if (key == Qt::Key_Return || Qt::Key_Enter == key) { //处理回车 } }
z55716368 2015-05-09
  • 打赏
  • 举报
回复
@LazyDreamHunter 你好 我想问问怎么触发tebleview的回车事件 我的Model是QStandardItemModel 我需要进行双击编辑保存到数据库操作 没弄过事件 毫无头绪啊
水军总督 2013-11-22
  • 打赏
  • 举报
回复
引用 13 楼 LazyDreamHunter 的回复:
已经加关注了
嗯嗯
RabinSong 2013-11-22
  • 打赏
  • 举报
回复
已经加关注了
水军总督 2013-11-22
  • 打赏
  • 举报
回复
引用 10 楼 LazyDreamHunter 的回复:
实际上可以是同一个ctblview: class ctblview { signals: void txLastRow(); private slots: void rxLastRow(); }
感谢哥,项目完成了。前些天忙于一些其他的事情,还有就是客户项目本身的其它些小的BUG,还有呢,就是客户那边没再改需求了,所以等到今天才来结贴。Thank you... 最后呢,就是小弟有个请求,哥能互加个关注不?我想再问哥各方面的一些问题。发此帖前由于有见过哥在移动版块的身影,所以已经加关注了
u0116snail 2013-11-22
  • 打赏
  • 举报
回复
看楼主这头像,是玩三国杀的呀
RabinSong 2013-11-16
  • 打赏
  • 举报
回复
实际上可以是同一个ctblview: class ctblview { signals: void txLastRow(); private slots: void rxLastRow(); }
RabinSong 2013-11-16
  • 打赏
  • 举报
回复
你可以两个表之间建立一个信号,当到最后一行的时候,发送一个信号,另一个表接收该信号,在信号槽里,实现光标的移动,方法同上。 伪代码如下: keyEvent: if (last row) { emit txLastRow(); } 另一个表里: void rxLastRow() { index = model()->index(row, col); pWidget = pDelegate->createEditor(this, option, index); pWidget->setGeometry(100, y, 100, 30); pWidget->setFocus(); pWidget->show(); setCurrentIndex(index); }
水军总督 2013-11-16
  • 打赏
  • 举报
回复
引用 7 楼 LazyDreamHunter 的回复:
你的ui->setupUi里的QTableView替换成CTblView
感谢哥,好像可以了。 不过,在一个tableView中可以,如果说我有多个tableView,每按一次回车移动一次光标,移动到该tableView最后一格后,如果我想再按一次回车后能将光标移到下一个tableView的第一格,怎么改。真心感谢哥
RabinSong 2013-11-16
  • 打赏
  • 举报
回复
你的ui->setupUi里的QTableView替换成CTblView
RabinSong 2013-11-16
  • 打赏
  • 举报
回复
void setupUi(QMainWindow *MainWindow) { if (MainWindow->objectName().isEmpty()) MainWindow->setObjectName(QString::fromUtf8("MainWindow")); MainWindow->resize(400, 300); centralWidget = new QWidget(MainWindow); centralWidget->setObjectName(QString::fromUtf8("centralWidget")); tableView = new QTableView(centralWidget); tableView->setObjectName(QString::fromUtf8("tableView")); tableView->setGeometry(QRect(70, 10, 256, 192)); MainWindow->setCentralWidget(centralWidget); menuBar = new QMenuBar(MainWindow); menuBar->setObjectName(QString::fromUtf8("menuBar")); menuBar->setGeometry(QRect(0, 0, 400, 23)); MainWindow->setMenuBar(menuBar); mainToolBar = new QToolBar(MainWindow); mainToolBar->setObjectName(QString::fromUtf8("mainToolBar")); MainWindow->addToolBar(Qt::TopToolBarArea, mainToolBar); statusBar = new QStatusBar(MainWindow); statusBar->setObjectName(QString::fromUtf8("statusBar")); MainWindow->setStatusBar(statusBar); retranslateUi(MainWindow); QMetaObject::connectSlotsByName(MainWindow); } // setupUi tableView = new QTableView(centralWidget); 将其替换成CTblView
水军总督 2013-11-16
  • 打赏
  • 举报
回复
引用 4 楼 LazyDreamHunter 的回复:
CTblView tblview; Widget w; QHBoxLayout *phLayout = new QHBoxLayout; phLayout->addWidget(&tblView); w.setLayout(phLayout); w.show(); 那木tblView就会布局在w里。 前提是w没有设置布局;
哥,已经有布局了,在widget.cpp文件中已经设置了布局了。因为前面说过的,ui文件中还有其他控件,所以之前已经给他们布局了。 该怎么修改呢哥?
RabinSong 2013-11-16
  • 打赏
  • 举报
回复
CTblView tblview; Widget w; QHBoxLayout *phLayout = new QHBoxLayout; phLayout->addWidget(&tblView); w.setLayout(phLayout); w.show(); 那木tblView就会布局在w里。 前提是w没有设置布局;
水军总督 2013-11-16
  • 打赏
  • 举报
回复
引用 2 楼 LazyDreamHunter 的回复:
int main(int argc, char *argv[]) { QApplication a(argc, argv); QStandardItemModel *model_2 = new QStandardItemModel; model_2->setColumnCount(4); model_2->setRowCount(2); QStandardItem *item_2_00 = new QStandardItem("时间"); model_2->setItem(0,0,item_2_00); QStandardItem *item_2_02 = new QStandardItem("地点"); model_2->setItem(0,2,item_2_02); QStandardItem *item_2_10 = new QStandardItem("人物"); model_2->setItem(1,0,item_2_10); QStandardItem *item_2_12 = new QStandardItem("事件"); model_2->setItem(1,2,item_2_12); model_2->item(0,0)->setEditable(false); model_2->item(0,2)->setEditable(false); model_2->item(1,0)->setEditable(false); model_2->item(1,2)->setEditable(false); CTblView tblview; tblview.setModel(model_2); tblview.show(); return a.exec(); }
首先,感谢哥的源码,新建了个工程并对哥的源码稍作修改后,能实现点击回车键时光标会移动到下一个无字表格的效果了。 但是还有点问题想请教下哥,我自己原来的工程中,是以QWidget为基类建的工程,在ui界面中,有我原来的tableView,还有有其它功能(如搜索查询等)的各种控件。在main.cpp源文件中,已经有如下代码
Widget w;
    w.show();
如果我在原工程中建立一个继承自QTableView的Qt设计师界面类CTblView,该怎么在widget.cpp文件中建立对象。因为我原本的对象是ui界面中直接拉QTableView的,本来已经有几百行代码了,我不想大改。 基础不够扎实,让哥见笑了。先行谢过
RabinSong 2013-11-16
  • 打赏
  • 举报
回复
int main(int argc, char *argv[]) { QApplication a(argc, argv); QStandardItemModel *model_2 = new QStandardItemModel; model_2->setColumnCount(4); model_2->setRowCount(2); QStandardItem *item_2_00 = new QStandardItem("时间"); model_2->setItem(0,0,item_2_00); QStandardItem *item_2_02 = new QStandardItem("地点"); model_2->setItem(0,2,item_2_02); QStandardItem *item_2_10 = new QStandardItem("人物"); model_2->setItem(1,0,item_2_10); QStandardItem *item_2_12 = new QStandardItem("事件"); model_2->setItem(1,2,item_2_12); model_2->item(0,0)->setEditable(false); model_2->item(0,2)->setEditable(false); model_2->item(1,0)->setEditable(false); model_2->item(1,2)->setEditable(false); CTblView tblview; tblview.setModel(model_2); tblview.show(); return a.exec(); }
RabinSong 2013-11-16
  • 打赏
  • 举报
回复
class CTblView : public QTableView { Q_OBJECT public: CTblView(QWidget *parent = NULL) : QTableView(parent) { verticalHeader()->hide(); horizontalHeader()->hide(); pWidget = NULL; } protected: void keyPressEvent(QKeyEvent *event) { int key = event->key(); if (key == Qt::Key_Return || Qt::Key_Enter == key) { QStyleOptionViewItem option; QModelIndex index = currentIndex(); if (index.isValid()) { int row = index.row(); int y = 0; if (row == 0) { row = 1; y = 30; } else row = 0; 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::keyPressEvent(event); } private: QWidget *pWidget; };
资源下载链接为: https://pan.quark.cn/s/9e7ef05254f8 在Qt开发,QTableWidget 是一个用于展示二维表格数据并提供交互功能的常用组件。默认情况下,当用户在编辑单元格内容后按下回车键,QTableWidget 会结束当前单元格的编辑状态,但不会自动将焦点移动到下一个单元格。为了实现按下回车键后焦点自动移动到下一个单元格的功能,我们需要自定义键盘事件处理。 以下是实现该功能的代码示例: 在这段代码,keyPressEvent 函数用于捕获键盘事件。当检测到按下回车键时,它会检查是否有下一个单元格可以聚焦。如果有,焦点会移动到下一个单元格;如果没有,事件会被传递给默认的处理方式,可能结束单元格编辑。同时,通过 connect 设置了当单元格内容改变时触发 handleCellChanged 函数,可用于处理单元格内容的保存或其他业务逻辑。 需要注意的是,QTableWidget 通常与 QTableView 和 QAbstractItemModel 一起使用,以实现更复杂的表格操作和数据绑定。但在这个实现,我们直接在 QTableWidget 上操作,简化了代码。在项目文件,mainwindow.cpp、mainwindow.h 和 mainwindow.ui 是创建 MainWindow 类及其界面布局的源代码文件。main.cpp 是程序的入口点,而 Makefile 和 .pro 文件用于构建项目。ui_mainwindow.h 是 mainwindow.ui 界面设计自动生成的头文件。这些文件共同构成了一个简单的 Qt 应用程序,包含了实现上述功能的全部代码。

21,437

社区成员

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

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