2013-07-09 8 views
5

Ich habe ein Problem. Wenn Platz (zum Beispiel) zwei oder mehr QTableView s in MainWindow, keine Arbeit Registerkarte Bestellung. Warum? Weil Tab ist Capture von QTableView (Zeiger auf die Zelle QTableView). Wie kann ich TAB in QMainWindow senden? Ich kann Fokus von einem QTableView zu einem anderen ändern, wenn Tab gedrückt wurde.QTableView in MainWindow und Registerkarte Bestellung

Wie kann ich es tun? Kann mir bitte jemand helfen?

#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

Die Frage ist mir nicht klar. Fragen Sie, ob die 'Tab'-Taste nicht wie erwartet funktioniert, wenn Sie zwei' QTableView' in einem 'QMainWindow' haben? Was ist das Verhalten, das Sie erwarten, und welches Verhalten erhalten Sie stattdessen? Bitte geben Sie auch einen Code an, wie Sie die 'QTableView's erstellt und in das' QMainWindow' eingefügt haben. – Boris

+0

In Code ist nichts besonderes. Mein Problem ist, dass qtableview TAB schluckt, weil der Zeiger auf die Zelle verschoben wird. Ich platziere es hier. Einen Moment. Aber wenn Sie es versuchen, müssen Sie das gleiche Problem haben. Platzieren Sie zwei QTableView (mit beliebigen Elementen und beliebigen Spalten) in MainWindow und drücken Sie dann die Taste, um den Fokus auf die zweite qtableview zu ändern. Du versagst in diesem Moment. Weil die Registerkarte gefangen wird und in QTableView bleibt (nicht im Hauptfenster). – exo

Antwort

7

Wenn ich die Frage richtig verstanden habe, haben Sie zwei QTableView s in einem einzigen QMainWindow (zum Beispiel eine QGridLayout verwendet wird) und möglicherweise auch andere QWidget s, und Sie möchten die Tastaturfokus zwischen ihnen navigieren, aber Sie können nicht, weil der Tastaturfokus auf einem QTableView (wahrscheinlich der erste) bleibt.

Wenn dies der Fall ist, sollten Sie diese Optionen versuchen (möglicherweise zusammen):

Zuerst reimplementiert die keyPressEvent Ihrer QTableView wie folgt aus:

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

Zweitens im Konstruktor Sie Tabelle Ansicht, deaktivieren Tastaturfokus (so dass der Fokus schaltet durch Ihre anderen Widgets nur mit Tab)

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

Schließlich können Sie im Konstruktor Ihrer QMainWindow nach dem Erstellen und Hinzufügen der Tabellenansichten im Layout den Hauptfokus angeben (der von den Tabellenansichten übernommen wurde, außer Sie haben den zweiten Punkt ausgeführt).

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

aktualisiert

Das folgende komplette minimal Beispiel kompiliert und arbeitet als für mich erwartete: ich habe zwei TableView s nebeneinander an der Spitze, und zwei Tasten auf der Unterseite. Mit Tab Zyklen zwischen diesen 4 Widgets, ohne zu ändern, deren Zellen sind in der TableView s markiert/hervorgehoben. Ich kann den Fokus auf einen gewünschten TableView entweder durch Auswahl mit der Maus oder durch Verwendung von Tab. Sobald der Fokus auf der gewünschten TableView liegt, kann ich mit den Tastaturpfeilen durch die Zellen gehen (oder mit der Maus klicken).

#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

Es ist was ich meine, vielen Dank (event-> igonre()). Jetzt habe ich ein kleines Problem :-). Wenn der erste QTableVeiw den Fokus verliert, kann ich ihn nicht mit der Maus zurückgeben.Das ist eine andere Art von Veranstaltung, nicht wahr? – exo

+0

@exo normalerweise, wenn Sie 'setFocusPolicy (Qt :: ClickFocus);' verwenden, sollte es funktionieren, während 'setFocusPolicy (Qt :: NoFocus);' auch verbieten, Fokus durch Mausklick zu erhalten. Du hast meine Antwort wahrscheinlich schon gesehen, bevor ich sie bearbeitet habe ;-) – Boris

+0

@exo im Zweifel, du kannst sie auch bei 'Qt :: StrongFocus' lassen (das ist meiner Meinung nach der Standard für' QTableView'), also kannst du * auch * Gehen Sie mit TAB in die Tabelle. – Boris