2013-07-09 13 views
5

I Have a problem. Quando si posiziona (ad esempio) due o più QTableView in MainWindow, nessun ordine di tabulazione di lavoro. Perché? Poiché la scheda è acquisita da QTableView (puntatore alla cella QTableView). Come posso inviare TAB in QMainWindow? Posso cambiare la messa a fuoco di un modulo QTableView in un altro quando è stata premuta la scheda.QTableView in MainWindow e tabulazione

Come posso farlo? Qualcuno mi può aiutare per favore?

#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; 
} 
+0

La domanda non è chiara per me. Stai chiedendo che la chiave 'Tab' non funzioni come ti aspetti, quando hai due' QTableView's in una 'QMainWindow'? Qual è il comportamento che ti aspetti e qual è il comportamento che ottieni? Inoltre, per favore fornisci del codice su come hai creato 'QTableView's e li hai inseriti all'interno di' QMainWindow'. – Boris

+0

Nel codice non è niente di speciale. Il mio problema è che qtableview ingoia TAB perché sposta il puntatore sulla cella. Lo posto qui. Un momento. Ma quando lo provi, devi avere lo stesso problema. Posiziona due QTableView (con qualsiasi oggetto e qualsiasi colonna) in MainWindow e poi premi la scheda per cambiare focus in seconda qtableview. Fallisci in questo momento. Perché la scheda verrà catturata e rimarrà in QTableView (non emessa nella finestra principale). – exo

risposta

7

Se ho capito bene la domanda, avete due QTableView s all'interno di un unico QMainWindow (per esempio, utilizzando un QGridLayout) ed eventualmente altri QWidget s, e si desidera navigare il focus tastiera tra di loro, ma non è possibile perché la messa a fuoco della tastiera rimane su un QTableView (molto probabilmente il primo).

Se questo è il caso, si dovrebbe provare queste opzioni (possibilmente insieme):

In primo luogo, reimplementa il keyPressEvent del vostro QTableView come questo:

void MyTableView::keyPressEvent (QKeyEvent * event) 
{ 
    if(event->key() == Qt::Key_Tab) 
     event->ignore(); 
    else 
     QTableView::keyPressEvent(event); 
} 

In secondo luogo, nel costruttore di voi tavolo vista, disabilitando punto focale della tastiera (in modo che il ciclo si concentrerà attraverso i vostri altri widget solo utilizzando Tab)

void MyTableView::MyTableView() 
{ 
    setFocusPolicy(Qt::ClickFocus); // allow giving focus with mouse click, 
            // but not with TAB key 
} 

Infine, nel costruttore del tuo QMainWindow, dopo aver creato e aggiunto le viste di tabella nel layout, puoi dare alla finestra principale lo stato attivo (che deve essere preso dalle viste della tabella, a meno che tu non abbia fatto il secondo punto), chiamando:

void MyMainWindow::MyMainWindow() 
{ 
    setFocus(Qt::OtherFocusReason); 
} 

Aggiornamento

Il seguente esempio minimale completa compila e funziona come previsto per me: ho due TableView s uno accanto all'altro sulla parte superiore, e due pulsanti sulla parte inferiore. L'utilizzo della scheda Tab si sposta tra questi 4 widget, senza modificare le cui celle sono selezionate/evidenziate negli TableView s. Posso focalizzare l'attenzione su un TableView desiderato selezionandoli con il mouse o usando la scheda Tab. Una volta messo a fuoco lo desiderato, posso spostarmi tra le celle usando le frecce della tastiera (o facendo clic con il mouse).

#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(); 
} 
+0

È quello che intendo, grazie mille (event-> igonre()). Ora ho un piccolo problema :-). Quando il primo QTableVeiw ha perso il focus, non posso restituirlo con il mouse.Questo è un diverso tipo di evento vero? – exo

+0

@exo normalmente, se si utilizza 'setFocusPolicy (Qt :: ClickFocus);', dovrebbe funzionare, mentre 'setFocusPolicy (Qt :: NoFocus);' proibisce anche di ottenere lo stato attivo facendo clic con il mouse. Probabilmente hai visto la mia risposta prima di modificarla ;-) – Boris

+0

@exo in dubbio, puoi anche lasciarlo a 'Qt :: StrongFocus' (che credo sia l'impostazione predefinita per' QTableView'), quindi puoi * anche * vai nel tavolo usando TAB. – Boris