[gelöst]Keyboard-Hook in QMainWindows

Alles rund um die Programmierung mit Qt
Antworten
-Marco-
Beiträge: 47
Registriert: 4. April 2006 16:35

[gelöst]Keyboard-Hook in QMainWindows

Beitrag von -Marco- »

Hi,

kann sein, das ich hier auf den Schlauch steh und das Problem ganz einfach zu lösen ist.
Jedenfalls möchte ich in einen Hauptfenster per Tab-Taste zwischen zwei bestimmten Widget hin- und herschalten, und zwar unabhängig welches Widget den Focus hat.
Also so ähnlich wie bei einen 2-Panel-Filemanager.
Es können aber noch andere Widgets den Focus haben, trotzdem soll bei Druck auf Tab der Focus entsprechend gewechselt werden.
Bsp.: ein Hauptfenster mit einen LineEdit und 2 TableViews. Zwischen den TableViews soll gewechselt werden. Den aktuellen Focus hat jetzt aber das LineEdit.

Nun, ich könnte von jedem Widget, was den Focus erhalten könnte eine Klasse ableiten und die KeyPressedEvents überschreiben. Das erscheint mir aber nicht sehr elegant.
Hat jemand eine Lösung?
Zuletzt geändert von -Marco- am 13. Oktober 2006 13:15, insgesamt 1-mal geändert.
isifloh
Beiträge: 37
Registriert: 31. August 2006 09:40

Beitrag von isifloh »

hi

schau dir mal diese methode an
void QWidget::setTabOrder ( QWidget * first, QWidget * second )

habs zwar nicht extra ausprobiert aber das dürft für dich passen.

mfg
-Marco-
Beiträge: 47
Registriert: 4. April 2006 16:35

Beitrag von -Marco- »

Hallo,

mmh, TabOrder beachtet doch alle Steuerelemente?
Ich möchte aber, daß die einzelnen Widgets nicht von vorne nach hinten den Fokus erhalten, sondern egal wo der Fokus steht, zwischen den beiden Views gewechselt wird (die zuletzt fokussierte View wird gespeichert).
Gruß Marco
isifloh
Beiträge: 37
Registriert: 31. August 2006 09:40

Beitrag von isifloh »

hi

mach folgendes
setTabOrder(left, right);
setTabOrder(right, left);

wobei left der Linke View ist und right der rechte.

hab das in ein kleines test programm bei mir gepackt und zusätzlich noch 2 combofelder reingetan und es lief.

Wenn man nun innerhalb der Combofelder auf tab drückte sprang es wieder in das zuleft aktivierte view hinein. das dürft doch das sein was du möchtest ?

mfg
-Marco-
Beiträge: 47
Registriert: 4. April 2006 16:35

Beitrag von -Marco- »

Moin,
mmh, ich habe mir auch mal ein kleines Testprojekt zusammengeschustert, aber irgendwie will das dort nicht so richtig.

Code: Alles auswählen

class MainWindow : public QMainWindow
{
    public:
    MainWindow()
    {
        QFrame* frame = new QFrame(this);

        this->setCentralWidget(frame);

        QSplitter* splitter = new QSplitter(Qt::Horizontal, frame);

        QLineEdit* edit1 = new QLineEdit(splitter);
        QLineEdit* edit2 = new QLineEdit(splitter);

        QVBoxLayout* layout = new QVBoxLayout(frame);

        layout->addWidget(splitter);

        QComboBox* cb;

        for (int i = 0; i < 5; i++)
        {
            cb = new QComboBox();
            layout->addWidget(cb);
        }

        QWidget::setTabOrder(edit1, edit2);
        QWidget::setTabOrder(edit2, edit1);

        this->setGeometry(0, 0, 600, 400);
    }
};
Die EditFelder entsprechen den Views.
Die einzelnen Steuerelemente bekommen immer noch nacheinander den Fokus.
Gruß Marco
isifloh
Beiträge: 37
Registriert: 31. August 2006 09:40

Beitrag von isifloh »

hi

werd wenn ich morgen zeit hab nochmal das beispiel rauskrammen.
und hier rein kopieren.

mfg
isifloh
Beiträge: 37
Registriert: 31. August 2006 09:40

Beitrag von isifloh »

hi

hab leider erst heut abend zeit gefunden.
ich weis jetzt wieso meines ging.

bei mir war left und right jeweils ein widget in dem der rest
comboxes und views drinnen ist.

mfg
-Marco-
Beiträge: 47
Registriert: 4. April 2006 16:35

Beitrag von -Marco- »

Moin,

ich habe mich nochmal mit der Sache auseinandergesetzt und siehe da, wie schon ganz oben erwähnt, ist des Rätsels Lösung einfacher als erwartet.

Das Zauberwort heißt hier QAction bzw. setShortcut in Verbindung mit dem Tab-Key.
Dieses QAction wird dem Hauptfenster per addAction untergeschoben und dann funktioniert so wie es soll. :)

Einfacher gehts nicht, man muß nur wissen wie es geht. :D
Gruß Marco
Antworten