主窗口中的QTableView和选项卡排序
QTableView in MainWindow and tab ordering
我有问题。在MainWindow
中放置(例如)两个或多个QTableView
时,没有工作选项卡排序。为什么?因为选项卡由QTableView
(指向单元格QTableView
的指针)捕获。如何将TAB发送到QMainWindow
?按下tab键时,我可以将焦点从一个QTableView
更改为另一个。
我该怎么做?有人能帮我吗?
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QtWidgets>
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
QFileSystemModel *myModel;
myModel = new QFileSystemModel(this);
myModel->setReadOnly(true);
myModel->setRootPath("C:\");
ui->tableView->setModel(myModel);
ui->tableView->setSelectionMode(QAbstractItemView::SingleSelection);
ui->tableView->setSelectionBehavior(QAbstractItemView::SelectRows);
ui->tableView->setRootIndex(myModel->index("C:\"));
QFileSystemModel *myModel2;
myModel2 = new QFileSystemModel(this);
myModel2->setReadOnly(true);
myModel2->setRootPath("C:\");
ui->tableView_2->setModel(myModel2);
ui->tableView_2->setRootIndex(myModel2->index("C:\"));
}
MainWindow::~MainWindow()
{
delete ui;
}
如果我正确理解这个问题,那么在单个QMainWindow
(例如,使用QGridLayout
)和可能的其他QWidget
中有两个QTableView
,并且您希望在它们之间导航键盘焦点,但您不能,因为键盘焦点停留在QTableView
上(很可能是第一个)。
如果是这种情况,你应该尝试这些选项(可能一起):
首先,重新实现QTableView
的keyPressEvent,如下所示:
void MyTableView::keyPressEvent (QKeyEvent * event)
{
if(event->key() == Qt::Key_Tab)
event->ignore();
else
QTableView::keyPressEvent(event);
}
其次,在表视图的构造函数中,禁用键盘焦点(这样焦点将仅通过使用Tab在其他窗口小部件中循环)
void MyTableView::MyTableView()
{
setFocusPolicy(Qt::ClickFocus); // allow giving focus with mouse click,
// but not with TAB key
}
最后,在QMainWindow
的构造函数中,在布局中创建并添加表视图后,您可以通过调用:来为主窗口提供焦点(除非您完成了第二点,否则将由表视图占据)
void MyMainWindow::MyMainWindow()
{
setFocus(Qt::OtherFocusReason);
}
更新
以下完整的最小示例按照我的预期编译和工作:我在顶部有两个并排的TableView
,在底部有两个按钮。使用选项卡在这4个窗口小部件之间循环,而无需修改在TableView
s中选择/突出显示的单元格。我可以通过鼠标选择它们或使用选项卡将焦点集中在所需的TableView
上。一旦焦点放在所需的TableView
上,我就可以使用键盘箭头(或用鼠标点击)在单元格中移动。
#include <QtGui>
class TableView: public QTableView
{
void keyPressEvent(QKeyEvent * event)
{
if(event->key() == Qt::Key_Tab)
event->ignore();
else
QTableView::keyPressEvent(event);
}
};
int main(int argc, char ** argv)
{
QApplication app(argc, argv);
QGridLayout * layout = new QGridLayout();
// the first Model/View pair
QFileSystemModel * model1 = new QFileSystemModel();
model1->setRootPath(QDir::rootPath());
TableView * view1 = new TableView();
view1->setModel(model1);
layout->addWidget(view1,0,0);
// the second Model/View pair
QFileSystemModel * model2 = new QFileSystemModel();
model2->setRootPath(QDir::rootPath());
TableView * view2 = new TableView();
view2->setModel(model2);
layout->addWidget(view2,0,1);
// Other widgets
layout->addWidget(new QPushButton("Hello"),1,0);
layout->addWidget(new QPushButton("World"),1,1);
// Create the window containing them and show it
QWidget * w = new QWidget();
w->setLayout(layout);
w->show();
return app.exec();
}
相关文章:
- 二叉排序树无法编译
- 如何在选项卡视图Qt中设置一个新项目,并保存以前的项目
- Win32编译器选项和内存分配
- 仅使用绝对值对数组进行排序,并在C++中显示实际值
- C++选择排序算法中的逻辑错误
- 使用C++程序合并排序没有得到正确的输出
- 计算排序向量的向量中唯一值的计数
- 排序算法c++
- 使用2个键的cpp-stl::优先级队列排序不正确
- 将结构向量排序为子组
- 在c++中尝试对对象数组进行排序时,出现std:bad_alloc错误
- 如何对点云数据进行排序
- C/C++预处理器是否可以检测一些编译器选项
- 是否有C++编译器选项允许激进地删除所有函数调用,并将参数传递给具有空体的函数
- 对字符串进行排序时,在c++中处理sort()
- 在C++标准中,语法选项的表示中没有隐含的排序,这种说法正确吗
- MFC选项卡以编程方式排序
- std::set,它有多个排序选项
- C++:斯科特·迈耶斯 "Effective STL":第 31 项:了解您的排序选项:帮助理解
- 主窗口中的QTableView和选项卡排序