在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中建立表格后,是两行四个格的表,共八格。四格有字的不可编辑,四个无字的可编辑。
想实现在编辑其中一个无字的格子时,点击回车键,光标会移动到下一个无字表格。
...全文
1032 17 打赏 收藏 转发到动态 举报
写回复
用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; };

16,216

社区成员

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

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