Skip to content
  • Categories
  • Recent
  • Tags
  • Popular
  • Users
  • Groups
  • Search
  • Get Qt Extensions
  • Unsolved
Collapse
Brand Logo
  1. Home
  2. Qt Development
  3. General and Desktop
  4. How to properly clear and change layouts?

How to properly clear and change layouts?

Scheduled Pinned Locked Moved General and Desktop
1 Posts 1 Posters 1.8k Views
  • Oldest to Newest
  • Newest to Oldest
  • Most Votes
Reply
  • Reply as topic
Log in to reply
This topic has been deleted. Only users with topic management privileges can see it.
  • A Offline
    A Offline
    Asperamanca
    wrote on last edited by
    #1

    (Qt 4.7.3)

    I am using QGraphicsGridLayout to lay out several QGraphicsWidgets.

    On occasion, I want to re-arrange the items, and remove or add some items to the layout. I found that the methods provided don't exactly make this a piece of cake:

    -) No clear() ? Seriously?
    -) removeAt, but only with an index? What is this index supposed to mean? I didn't find it anywhere else.
    -) How can I reset a row's fixed height, once I have set it?
    -) Will now-unused rows and columns be removed automagically? Or will they remain as artifacts, and possibly use up space?

    Here is what I tried so far:

    I have written my own clear():

    @void CCvui_WidgetManager::clearLayout(QGraphicsLayout* pLayout)
    {
    if ( ! pLayout)
    {
    return;
    }

    for (int i = pLayout->count()-1; i >= 0; --i)
    {
        pLayout->removeAt(i);
    }
    

    }@

    I have pointers to all my widgets as members, so I can temporarily handle the fact they are no longer "owned" by the layout.

    Then, I have two possible layouts I want to be able to switch between:

    @void CCvui_WidgetManager::arrangeLayoutForAnalogAndBinary()
    {
    clearLayout(m_pComponentLayout);

    // All items are visible in this layout variant
    m_pComponentLayout->addItem(m_pAnalogLegend,0,0,
                                Qt::AlignTop | Qt::AlignHCenter);
    m_pComponentLayout->addItem(m_pDateLabel,1,0,
                                Qt::AlignBottom | Qt::AlignHCenter);
    m_pComponentLayout->addItem(m_pBinaryLegend,2,0,1,2);
    m_pComponentLayout->addItem(m_pValueScale,0,1);
    m_pComponentLayout->addItem(m_pAnalogCurveCanvas,0,2);
    m_pComponentLayout->addItem(m_pTimeScale,1,2,1,1);
    m_pComponentLayout->addItem(m_pBinaryCurveCanvas,2,2,1,1);
    

    }

    void CCvui_WidgetManager::arrangeLayoutForBinaryOnly()
    {
    clearLayout(m_pComponentLayout);

    m_pComponentLayout->addItem(m_pBinaryLegend,0,0,1,2);
    m_pComponentLayout->addItem(m_pBinaryCurveCanvas,0,2,1,1);
    m_pComponentLayout->addItem(m_pTimeScale,1,2,1,1);
    m_pComponentLayout->addItem(m_pDateLabel,1,0,
                                Qt::AlignBottom | Qt::AlignHCenter);
    // The following items are invisible, and therefore not added
    // to the layout:
    m_pAnalogLegend->setParentItem(m_pSpareComponents);
    m_pAnalogCurveCanvas->setParentItem(m_pSpareComponents);
    m_pValueScale->setParentItem(m_pSpareComponents);
    // Set a parent so they are deleted correctly.
    

    }@

    As you can see, I use the same layout, the same cells, and the same items, but I arrange them differently. In addition, in layout variant "binaryOnly", I have a few invisible items, which I must "park" in an invisible item in order to keep the ownership clear.

    The only solution that looks promising I have found so far is to
    -) Remove all items from the layout
    -) delete the layout
    -) re-create the layout
    -) re-add the items to the layout
    -) re-add the layout to its parent

    Is there any simpler, reliable way to re-arrange my items within the layout?

    1 Reply Last reply
    0

    • Login

    • Login or register to search.
    • First post
      Last post
    0
    • Categories
    • Recent
    • Tags
    • Popular
    • Users
    • Groups
    • Search
    • Get Qt Extensions
    • Unsolved