Seite 1 von 1

[gelöst]Keyboard-Hook in QMainWindows

Verfasst: 29. September 2006 15:41
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?

Verfasst: 29. September 2006 16:00
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

Verfasst: 29. September 2006 16:28
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).

Verfasst: 29. September 2006 16:40
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

Verfasst: 2. Oktober 2006 10:04
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.

Verfasst: 2. Oktober 2006 18:00
von isifloh
hi

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

mfg

Verfasst: 4. Oktober 2006 21:29
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

Verfasst: 10. Oktober 2006 13:36
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