Как правильно настроить QDockWidget, чтобы он отображался/скрывался?

Я новичок в графическом интерфейсе Qt и изначально хотел настроить виджет Qt Dock, который отображается при нажатии клавиши, скажем, «A», и скрывается при нажатии другой клавиши, скажем, «B». Но после небольшого исследования я не нашел подходящего решения.

Я попытался создать кнопку-переключатель, которая при первом нажатии покажет виджет док-станции, а при повторном нажатии скроет его. Он работает нормально, но есть ли способ сделать это лучше или назначить любую клавишу для отображения и скрытия виджета док-станции?

t_button = new QPushButton("B1",this);

dockB = new QDockWidget(tr("Panel B"),this);
dockB -> setAllowedAreas(Qt::AllDockWidgetAreas);
addDockWidget(Qt::RightDockWidgetArea,dockB);
dockB -> hide();

connect(t_button,SIGNAL(clicked()),this,SLOT(toggle()));

void MainWindow::toggle()
{
    if(!click)
        dockB->show();
    else
        dockB->hide();
    click=!click;
}

person Rohit    schedule 23.07.2019    source источник
comment
Это QDockWidget::toggleViewAction() тоже может быть интересным.   -  person vahancho    schedule 23.07.2019


Ответы (1)


Чтобы связать нажатия клавиш с действиями, QShortCut несет ответственность.

Класс QShortcut предоставляет способ подключения сочетаний клавиш к механизму сигналов и слотов Qt, чтобы объекты могли быть проинформированы о выполнении сочетания клавиш. Ярлык можно настроить так, чтобы он содержал все нажатия клавиш, необходимые для описания сочетания клавиш, включая состояния клавиш-модификаторов, таких как Shift, Ctrl и Alt.

В некоторых виджетах использование «&» перед символом автоматически создает мнемонику (ярлык) для этого символа, например. «Выход» создаст сочетание клавиш Alt+X (используйте «&&», чтобы отобразить фактический амперсанд). Виджет может потреблять и выполнять действие с заданным ярлыком. В X11 амперсанд отображаться не будет, а символ будет подчеркнут. В Windows ярлыки обычно не отображаются, пока пользователь не нажмет клавишу Alt, но пользователь может изменить эту настройку. На Mac ярлыки по умолчанию отключены. Вызовите qt_set_sequence_auto_mnemonic(), чтобы включить их. Однако, поскольку мнемонические сокращения не соответствуют рекомендациям Aqua, Qt не будет отображать подчеркнутый символ сокращения.

Для приложений, использующих меню, может быть удобнее использовать вспомогательные функции, предоставленные в классе QMenu, для назначения сочетаний клавиш элементам меню по мере их создания. В качестве альтернативы ярлыки могут быть связаны с другими типами действий в классе QAction.

Самый простой способ создать ярлык для определенного виджета — создать ярлык с последовательностью клавиш. Например:

shortcut = new QShortcut(QKeySequence(tr("Ctrl+O", "File|Open")),
                         parent);

Когда пользователь набирает последовательность клавиш для данного ярлыка, генерируется сигнал активированного() ярлыка. (В случае двусмысленности генерируется сигнал activeAmbiguously().) Ярлык "прослушивается" циклом обработки событий Qt, когда родительский виджет ярлыка получает события.

Небольшой образец testQDockWidgetShortCut.cc:

#include <QtWidgets>

int main(int argc, char **argv)
{
  qDebug() << "Qt Version:" << QT_VERSION_STR;
  QApplication app(argc, argv);
  // setup GUI
  QMainWindow qMainWin;
  QDockWidget qDockB("Panel B");
  qDockB.setAllowedAreas(Qt::AllDockWidgetAreas);
  qMainWin.addDockWidget(Qt::RightDockWidgetArea, &qDockB);
  qDockB.hide();
  // a window action to show dock on [A]
  QAction qCmdShowDockB(&qMainWin);
  qCmdShowDockB.setShortcut(QKeySequence("A"));
  qMainWin.addAction(&qCmdShowDockB);
  // a window action to hide dock on [B]
  QAction qCmdHideDockB(&qMainWin);
  qCmdHideDockB.setShortcut(QKeySequence("B"));
  qMainWin.addAction(&qCmdHideDockB);
  // a button to toggle dock B
  QPushButton qBtn(
    "Show/Hide Panel B\n"
    "[A] ... Show Panel B\n"
    "[B] ... Hide Panel B\n"
    "[Ctrl+B] ... Toggle Panel B");
  qBtn.setShortcut(QKeySequence("Ctrl+B"));
  qMainWin.setCentralWidget(&qBtn);
  qMainWin.show();
  // install signal handlers
  QAction *pQCmd = qDockB.toggleViewAction();
  QObject::connect(&qBtn, &QPushButton::clicked, pQCmd, &QAction::trigger);
  QObject::connect(&qCmdShowDockB, &QAction::triggered, &qDockB, &QDockWidget::show);
  QObject::connect(&qCmdHideDockB, &QAction::triggered, &qDockB, &QDockWidget::hide);
  // runtime loop
  return app.exec();
}

Минимальный файл проекта testQDockWidgetShortCut.pro:

SOURCES = testQDockWidgetShortCut.cc

QT += widgets

Скомпилировано и протестировано на cygwin64:

$ qmake-qt5 testQDockWidgetShortCut.pro 

$ make && ./testQDockWidgetShortCut 
g++ -c -fno-keep-inline-dllexport -D_GNU_SOURCE -pipe -O2 -Wall -W -D_REENTRANT -DQT_NO_DEBUG -DQT_WIDGETS_LIB -DQT_GUI_LIB -DQT_CORE_LIB -I. -isystem /usr/include/qt5 -isystem /usr/include/qt5/QtWidgets -isystem /usr/include/qt5/QtGui -isystem /usr/include/qt5/QtCore -I. -I/usr/lib/qt5/mkspecs/cygwin-g++ -o testQDockWidgetShortCut.o testQDockWidgetShortCut.cc
g++  -o testQDockWidgetShortCut.exe testQDockWidgetShortCut.o   -lQt5Widgets -lQt5Gui -lQt5Core -lGL -lpthread 
Qt Version: 5.9.4

Снимок testQDockWidgetShortCut в X11 Снимок testQDockWidgetShortCut в X11 (с панелью B)

Скомпилировано протестировано в VS2017 и Qt5.13.0:

Qt Version: 5.13.0

Снимок testQDockWidgetShortCut в Windows 10 Снимок testQDockWidgetShortCut в Windows 10 (с панелью B)

(В обоих случаях я протестировал все предлагаемые сочетания клавиш: A, B, Ctrl+B, а также как нажатие кнопки.)


Интересно, что OP утверждает

Но после небольшого исследования я не нашел подходящего решения.

Возможно, это было бы проще с термином «горячая клавиша» или «горячая клавиша». В противном случае ОП должен был что-то найти, например.

SO: Как установить сочетание клавиш с тремя клавишами с двумя модификаторами клавиш в Qt?

который я считал возможным дубликатом.

person Scheff's Cat    schedule 23.07.2019