我有个问题.当放置(例如)两个或多个QTableViews时MainWindow,没有工作标签排序.为什么?因为tab是捕获的QTableView(指向单元格的指针QTableView).我该如何发送TAB QMainWindow?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;
}
Run Code Online (Sandbox Code Playgroud)
如果我正确地理解了这个问题,你就有两个QTableViews QMainWindow(例如,使用a QGridLayout)和可能的其他QWidgets,并且你想要在它们之间导航键盘焦点,但你不能因为键盘焦点停留在a QTableView(很可能是第一个).
如果是这种情况,您应该尝试这些选项(可能在一起):
首先,重新实现你QTableView喜欢的keyPressEvent :
void MyTableView::keyPressEvent (QKeyEvent * event)
{
if(event->key() == Qt::Key_Tab)
event->ignore();
else
QTableView::keyPressEvent(event);
}
Run Code Online (Sandbox Code Playgroud)
其次,在您的表视图的构造函数中,禁用键盘焦点(这样焦点将仅通过使用循环遍历其他小部件Tab)
void MyTableView::MyTableView()
{
setFocusPolicy(Qt::ClickFocus); // allow giving focus with mouse click,
// but not with TAB key
}
Run Code Online (Sandbox Code Playgroud)
最后在你的构造函数中QMainWindow,在布局中创建和添加表视图之后,可以通过调用以下命令为主窗口提供焦点(由表视图执行,除非您执行了第二点).
void MyMainWindow::MyMainWindow()
{
setFocus(Qt::OtherFocusReason);
}
Run Code Online (Sandbox Code Playgroud)
更新
以下完整的最小示例编译并按预期工作:我TableView在顶部彼此相邻两个,底部有两个按钮.使用Tab这4个小部件之间的循环,而无需修改TableViews 中选择/突出显示的单元格.我可以TableView通过使用鼠标选择它们或使用来获得所需的焦点Tab.一旦焦点在想要的上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();
}
Run Code Online (Sandbox Code Playgroud)