Important: Please read the Qt Code of Conduct - https://forum.qt.io/topic/113070/qt-code-of-conduct

Setting position of a widget



  • i want to set the position of a widget on top of another widget dynamically. how do i do it. what is the syntax can anyone help please. i want the new widget to be placed at exactly the same position where another is placed but on top of it


  • Moderators

    Hi,
    You can do this

    1. Get the position of the bottom widget
    2. Using these coordinates set the position for the new top widget

    For E.g:
    @
    QLabel *bottom = new QLabel(this);
    bottom->setGeometry(10,10,200,200);

    QLabel *top = new QLabel(this);
    top->setGeometry(bottom->x(),bottom->y(),200,200);

    // or

    top->move(bottom->x(),bottom->y());
    @



  • i tried that but the size of the widgets are not the same so it goes more down.
    i want the the bottom point of the widgets to be the same and not the top .
    so the bottom point of the widget should match with the bottom of the first one


  • Moderators

    Are the two widgets of the same size ?



  • no the first one is much smaller the width is same but the the height of the one to be positioned is much more


  • Moderators

    Then you need to do some calculations.
    Try this and see if this is what you want

    @
    QLabel *bottom = new QLabel(this);
    bottom->setGeometry(250,250,200,50);
    bottom->setStyleSheet("background-color: rgb(255,0,0)");

    QLabel *top = new QLabel(this);
    top->resize(200,200);
    top->move(bottom->x(),bottom->y()-(top->height()-bottom->height()));
    top->setStyleSheet("background-color: rgba(0,0,255,150)");
    @

    I have set the alpha component of the top widget so that we may see the effect.



  • it is appearing at that position but not on top of it i want it to appear on top of the previous widget but on doing this the previous widget just changes its position and appears over or under it .


  • Moderators

    This is because i have set the alpha component of the top widget to make it appear transparent so that we may see the bottom points of the two widgets coincide.
    Change
    @top->setStyleSheet("background-color: rgba(0,0,255,150)");@
    to
    @top->setStyleSheet("background-color: rgb(0,0,255)");@

    and check if this is what you want



  • no i meant that the transparency is not happening it first component is moving its position they appear like this

    list1


    list2

    while i want that they appear over one another
    i want the second widget to be placed over every other widget like a menu is visible over the others


  • Moderators

    Can you post you code or what you have tried? It would be hard to guess what would be the problem in your code.



  • list1 = new QListWidget;
    list1->addItem("tamnmay");
    list1->addItem("hghj");
    list1->addItem("tamnmay");
    list1->addItem("hghj");
    list1->addItem("tamnmay");
    list1->addItem("hghj");
    list1->setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff);

    for(int i=0;i<list1->count()-1;i++)
    {
        list1->setRowHidden(i,true);
    }
    list1->setSizePolicy(QSizePolicy::Fixed,QSizePolicy::Minimum);
    list1->setMaximumWidth(1500);
    
    list1->installEventFilter(this);
    
    setMinimumSize(700, 500);
    list1->setMaximumHeight(20);
    setWindowState(Qt::WindowMaximized);
    b1->setMaximumWidth(50);
    b1->setFlat(true);
    layout->addWidget(l1);
    layout->addWidget(b1);
    //layout->addWidget(list1);
    widget->setLayout(layout);
    widget->setStyleSheet("background-color: white; margin:0px");
    QDockWidget *dock = new QDockWidget;
    
    
    
    dock->setFeatures(QDockWidget::NoDockWidgetFeatures);
      dock->setAllowedAreas(Qt::BottomDockWidgetArea );
     customerList = new QListWidget();
      customerList->addItems(QStringList()
              << "John Doe, Harmony Enterprises, 12 Lakeside, Ambleton"
              << "Jane Doe, Memorabilia, 23 Watersedge, Beaton"
              << "Tammy Shea, Tiblanka, 38 Sea Views, Carlton"
              << "Tim Sheen, Caraba Gifts, 48 Ocean Way, Deal"
              << "Sol Harvey, Chicos Coffee, 53 New Springs, Eccleston"
              << "Sally Hobart, Tiroli Tea, 67 Long River, Fedula");
      customerList->setWindowFlags(Qt::Popup);
      customerList->setVisible(false);
      QWidget *widget2 = new QWidget;
      QVBoxLayout *lay = new QVBoxLayout;
      //lay->addWidget(customerList);
      lay->addWidget(list1);
      widget2->setLayout(lay);
    

    QWidget* lTitleBar = dock->titleBarWidget();
    QWidget* lEmptyWidget = new QWidget();
    lEmptyWidget->setVisible(false);

    statusBar()->addWidget(l1,0);
    dock->setTitleBarWidget(lEmptyWidget);
    delete lTitleBar;
    dock->setWidget(widget2);
    addDockWidget(Qt::BottomDockWidgetArea, dock);

    }
    bool MainWindow::eventFilter(QObject* object, QEvent* event )
    {

    if (object==list1)
    {
        if(event->type()==QEvent::Enter)
        {
            for(int i=1;i<list1->count();i++)
            {
    
                list1->setRowHidden(i,false);
            }
           //list1->setVisible(false);
    
            //customerList->setVisible(true);
           // customerList->show();
            customerList->setGeometry(list1->x(),list1->y(),300,500);
    
            menu=new QMenu(this);
            menu->exec&#40;list1->pos(&#41;);
            //list1->setVerticalScrollBarPolicy(Qt::ScrollBarAsNeeded);
            //list1->setMaximumHeight(60);
        }
    }

  • Moderators

    Please can you include it in Code tags. Its difficult to understand like this.



  • sorry
    @list1 = new QListWidget;
    list1->addItem("tamnmay");
    list1->addItem("hghj");
    list1->addItem("tamnmay");
    list1->addItem("hghj");
    list1->addItem("tamnmay");
    list1->addItem("hghj");
    list1->setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff);

    for(int i=0;i<list1->count()-1;i++)
    {
        list1->setRowHidden(i,true);
    }
    list1->setSizePolicy(QSizePolicy::Fixed,QSizePolicy::Minimum);
    list1->setMaximumWidth(1500);
    
    list1->installEventFilter(this);
    
    setMinimumSize(700, 500);
    list1->setMaximumHeight(20);
    setWindowState(Qt::WindowMaximized);
    b1->setMaximumWidth(50);
    b1->setFlat(true);
    layout->addWidget(l1);
    layout->addWidget(b1);
    //layout->addWidget(list1);
    widget->setLayout(layout);
    widget->setStyleSheet("background-color: white; margin:0px");
    QDockWidget *dock = new QDockWidget;
    
    
    
    dock->setFeatures(QDockWidget::NoDockWidgetFeatures);
      dock->setAllowedAreas(Qt::BottomDockWidgetArea );
     customerList = new QListWidget();
      customerList->addItems(QStringList()
              << "John Doe, Harmony Enterprises, 12 Lakeside, Ambleton"
              << "Jane Doe, Memorabilia, 23 Watersedge, Beaton"
              << "Tammy Shea, Tiblanka, 38 Sea Views, Carlton"
              << "Tim Sheen, Caraba Gifts, 48 Ocean Way, Deal"
              << "Sol Harvey, Chicos Coffee, 53 New Springs, Eccleston"
              << "Sally Hobart, Tiroli Tea, 67 Long River, Fedula");
      customerList->setWindowFlags(Qt::Popup);
      customerList->setVisible(false);
      QWidget *widget2 = new QWidget;
      QVBoxLayout *lay = new QVBoxLayout;
      //lay->addWidget(customerList);
      lay->addWidget(list1);
      widget2->setLayout(lay);
    

    QWidget* lTitleBar = dock->titleBarWidget();
    QWidget* lEmptyWidget = new QWidget();
    lEmptyWidget->setVisible(false);

    statusBar()->addWidget(l1,0);
    dock->setTitleBarWidget(lEmptyWidget);
    delete lTitleBar;
    dock->setWidget(widget2);

     addDockWidget(Qt::BottomDockWidgetArea, dock);
    

    }
    bool MainWindow::eventFilter(QObject* object, QEvent* event )
    {

    if (object==list1)
    {
        if(event->type()==QEvent::Enter)
        {
            for(int i=1;i<list1->count();i++)
            {
    
                list1->setRowHidden(i,false);
            }
           //list1->setVisible(false);
    
            //customerList->setVisible(true);
           customerList->show();
            customerList->setGeometry(list1->x(),list1->y(),300,500);
            //customerList->show();
    
            menu=new QMenu(this);
            menu->exec&#40;list1->pos(&#41;);
            //list1->setVerticalScrollBarPolicy(Qt::ScrollBarAsNeeded);
            //list1->setMaximumHeight(60);
        }
        if (event->type()==QEvent::ToolTip)
        {
    
        }
    }
    if(object==customerList)
    {
        if(event->type()==QEvent::Leave)
        {
            for(int i=0;i<list1->count()-1;i++)
            {
                list1->setRowHidden(i,true);
            }
            //list1->setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
    
            //list1->setMaximumHeight(20);
            customerList->hide();
        }
    }
    return false;
    

    }@



  • Is it possible to make next window as child of first it will show your next window always placed upon the parent and according to its geometry.



  • but i dont want it to be a seperate window perhaps i can use the widget as a popup or tootip but i am not being able to implement it do you have any idea on how to do it or any other way to implement my requirement


Log in to reply