主窗口中的QTableView和选项卡排序

QTableView in MainWindow and tab ordering

本文关键字:选项 排序 QTableView 窗口      更新时间:2023-10-16

我有问题。在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();
}