LINUX.ORG.RU

Как добавить QAction на QToolBar без генерации QToolButton?

 , , qtoolbar,


0

2

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

Я делаю QAction, задаю ему комбинацию горячих клавиш. Кладу эту QAction на QToolBar, создаю коннект. При добавлении действия, на QToolBar появляется кнопка. И мне эту кнопку надо скрыть.

Из документации выяснилось, что даже если получить указатель на созданную кнопку, то скрыть её невозможно. Методы setVisible(false) или hide() для такой кнопки работать не будут. Вместо этого предлагается делать setVisible(false) для QAction:

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);

    QAction *action = new QAction(this);
    action->setIcon( QIcon(QApplication::style()->standardIcon(QStyle::SP_FileIcon)) );
    action->setShortcut(QKeySequence(Qt::CTRL + Qt::Key_P));

    // Соединение для отладки нажатия
    connect(action, &QAction::triggered, this, &MainWindow::onAction);

    // Действие добавляется на панель
    ui->mainToolBar->addAction(action);

    // Выясняется кнопка, которая была создана и обрабатывает данное действие
    // QToolButton* currentButton=qobject_cast<QToolButton*>(ui->mainToolBar->widgetForAction(action));

    // Кнопка скрывается путем скрывания действия...
    action->setVisible(false);
}

void MainWindow::onAction()
{
    qDebug() << "onAction()";
}

Проблема в том, что если скрыть действие action->setVisible(false), то действие перестает выполняться. И. соответственно, комбинация горячих клавиш не работает.

Вопрос: как поместить на тулбар действие так, чтобы добавилась только комбинация клавиш. А самой кнопки бы не создаалось или она была не видна?

★★★★★
Ответ на: комментарий от XMs

Затем что действие должно принадлежать вполне конкретному виджету с его QToolBar, а не всему окну.

Xintrea ★★★★★
() автор топика

Вопрос: как поместить на тулбар действие так, чтобы добавилась только комбинация клавиш. А самой кнопки бы не создаалось или она была не видна?

Вопрос из разряда: как сделать так, чтобы оно было, но его не было. Ты либо делаешь что-то нестандартное, и юзеры будут страдать. Либо тебе просто надо QKeySequence без QAction.

ЗЫ: читал по-диагонали

UVV ★★★★★
()
Ответ на: комментарий от Xintrea

А с каких пор QToolBar стали размещаться иначе, чем через QMainWindow::addToolBar()? То есть, тулбар у тебя принадлежит этому виджету, и, соответственно, если ты тому же виджету сделаешь addAction(), поведение будет именно таким, как ты ожидаешь

XMs ★★★★★
()
Ответ на: комментарий от XMs

Ну это же неправильно, если действия, принадлежащие определенному тулбару будут пихаться в вышестоящий виджет.

Я исхитрился путем задания нуливого размера кнопке:

    // Выясняется кнопка, которая была создана и обрабатвает данное действие
    QToolButton* currentButton=qobject_cast<QToolButton*>(toolsLine->widgetForAction(action));

    if(!isVisible) {
        currentButton->setFixedHeight(0);
        currentButton->setFixedWidth(0);
    }

Xintrea ★★★★★
() автор топика
Ответ на: комментарий от Xintrea

Ну это же неправильно, если действия, принадлежащие определенному тулбару будут пихаться в вышестоящий виджет

Здрасти, приехали. Тулбар — это всего лишь панель для быстрого доступа к операциям главного окна. У тебя ведь QAction не с тулбаром работает, а с главным окном либо с главным виджетом этого окна, в крайнем случае с доками. Соответственно, и действия относятся не к тулбару.

А все эти нулевые размеры — изврат и костыли

XMs ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.