Jake Wade
Jake Wade

Reputation: 601

QToolbar force expand on too many QActions

Hi all is there any way to automatically expand a QToolbar if there is too many QActions in?

Using Qt version 5.4.1 C++11

Ive tried :ui->mainToolBar->setSizePolicy(QSizePolicy::MinimumExpanding, QSizePolicy::Preferred)

But this only expands it horizontally. I need it to expand vertically like the Expand button does.

Upvotes: 0

Views: 1655

Answers (2)

Jake Wade
Jake Wade

Reputation: 601

This is how you can make a function to expand/retract a QToolbar. Firstly using a Forloop get all the child widgets from the QToolbar. You can use a Bool to lock to only get the first Widget which is the Expanding button/Action.

bool get_first_action{true};
for(QWidget* widget : ui->myToolBar->findChildren<QWidget*>())
{
    if(get_first_action)
    {

        get_first_action = false;
        // This is the expanding action!
        m_action_expand = widget;
    }
}

Or you can do this which is probably a bit safer.

for(QWidget* widget : ui->myToolBar->findChildren<QWidget*>())
{
    if(widget->objectName() == "qt_toolbar_ext_button")
    {
        // This is the expanding action!
        m_action_expand = widget;
    }
}

Once you have the sneaky expanding action assign it to a member varible

// Make sure to initialize this in the constructor!
// m_action_expand = new QWidget(this // parent)
QWidget* m_action_expand;

Now create a handy function with a good name;

void MainWindow::forceToolbarExpand()
{
    // Grab the position of the expanding action/widget
    QPointF pos(m_action_expand->pos());

    // Create a fake/dummy event that replicates the mouse button press
    QMouseEvent event_press(QEvent::MouseButtonPress, pos, Qt::LeftButton,0, 0);

    // Create a fake/dummy event that replicates the mouse button release
    QMouseEvent event_release(QEvent::MouseButtonRelease, pos, Qt::LeftButton,0, 0);

    // These two events together will fire the QAction::Toggled signal.

    // Make sure to send the events!
    QApplication::sendEvent(m_action_expand, &event_press);
    QApplication::sendEvent(m_action_expand, &event_release);
}

And there we have it your QToolbar, if it can be expanded/retracted now will when you call this function. I'm not too sure if you can directly Moc/fake the toggled event but you can try it. I know this method works so yeah.

Upvotes: 0

dhaumann
dhaumann

Reputation: 1688

Always expanding a toolbar vertically is not possible as far as I know (never seen it). A solution would be to add multiple toolbars. This way, you can arrange them one under the other.

What you can try is to add a custom widget to the toolbar that grows horizontally. This was proposed here by using a QScrollArea... Not sure whether this is exactly what you want, but it may work good enough.

Upvotes: 1

Related Questions