Ustawienie fokus-a na pliku odrazu

0

Czy można zaznaczyć (ustawić focus) na wybrany pliku zaraz po otworzeniu okna dialogowego QFileDialog::exec()? Mam urządzenie bez myszki i klawisza Tab :( tylko strzałki , Enter i parę funkcyjnych

Domyślny fokus jest ustawiony nie na liście plików tylko na "file name" (poniżej listy)

Pomysły:

  1. wysłać parę razy Tab aby ustawić fokus na liście plików
  2. kombinując z grabKeyboard zasymulowac TAB innym wolnym przyciskiem
  3. symulować klikniecie myszką.

Wszystko kombinowane i pokraczne

PS: QFileDialog::selectFile() oczywiscie też nie działa

1

Najprościej będzie zbudować własne okno wyboru pliku, skoro masz tak ograniczoną kontrolę.

1

Ja bym spróbował coś w ten sposób:

QFileDialog dialog;
auto item = dialog.findChild<QListWidget *>(); // albo QListView
if (item) {
    item->setFocus(Qt::OtherFocusReason);
}

Nie mam teraz odpowiedniego komputera, by to przetestować.

Problemem jest "focus", który domyślnie ląduje w polu edycyjnym, a nie w widoku z listą plików.
QFileDialog::selectFile() zapwene wybrało odpowiednie plik (zanzaczyło w widoku odpowidni plik i wypełniło pewnie pole edycyjne), ale "focus" pozostał bez zmian.

Wada jest taka, że dokumencja nie mówi co ma być w UI QFileDialog więc dziś może działać a jutro już nie (lub na odwrót).

1

Ale to urządzenie ma ekran dotykowy czy jak fokus jest na polu do wpisania nazwy i nie da się nic zrobić bo brakuje klawiszy?

Pebal napisał(a):

Najprościej będzie zbudować własne okno wyboru pliku, skoro masz tak ograniczoną kontrolę.

Zgadzam się w 100%, powinieneś sam wyrzeźbić okno które będzie dostosowane do możliwości urządzenia. Czy najprościej to bym już nie był taki pewny

0

Poszedłem chwilę tropem zaproponowanym przez @MarekR22

QFileDialog dialog;
dialog.setOption(QFileDialog::DontUseNativeDialog, true);
auto item = dialog.findChild<QListView  *>(); 
if (item) {
    qDebug() << item->nextInFocusChain(); // QWidget(0x2585549c080, name="qt_scrollarea_viewport") 
    item->setFocus(Qt::OtherFocusReason);
    spdlog::error("znalazłem!");
}
if (dialog.exec())

I rzeczywiście jest tam QListView , fokus sie nie ustawia ale jest punkt zaczepienia

idę na skróty, bo to tylko do wewnętrznych testów,
wciskam Shif+TAB , co ustawia fokus na pierwszym pliku a tester już sobie wybierze

class XFileDialog : public QFileDialog
{
protected:
    // Delphi: onShow
    void showEvent(QShowEvent *event) override
    {
        QApplication::postEvent(this,
            new QKeyEvent(QEvent::KeyPress,
                          Qt::Key_Tab,
                          Qt::ShiftModifier,
                          QString(QChar(' ')))); // TODO co robi ostatni parametr ?
        QApplication::postEvent(this,
            new QKeyEvent(QEvent::KeyRelease,
                          Qt::Key_Tab,
                          Qt::ShiftModifier,
                          QString(QChar(' ')))); // TODO co robi ostatni parametr ?
    };
};
0

Za dużo problemów z użyciem QFileDialog w niekonwencjonalny sposób
, finalnie zrobiłem wlasne okno z udziałem QFileSystemModel + QListView

0

@zkubinski przykład z użyciem QDialog,QListView,QFileSystemModel
FileDialogWithFocus-sample.7z

1 użytkowników online, w tym zalogowanych: 0, gości: 1