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 get the position of widgets in QTablewidget
Qt 6.11 is out! See what's new in the release blog

How to get the position of widgets in QTablewidget

Scheduled Pinned Locked Moved Solved General and Desktop
19 Posts 2 Posters 3.8k Views 1 Watching
  • 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.
  • M MasterBlade

    @Bonnie It's a lambda function and should work.

    Actually I also connected the table with this function.

    connect(ui->table, &QTableWidget::customContextMenuRequested, [=](QPoint pos){ContextMenu(pos);});
    

    This is working alright. I can get the correct row number.

    B Offline
    B Offline
    Bonnie
    wrote on last edited by Bonnie
    #10

    @MasterBlade But that's not the correct way to use sender()

    1. If EffectTable::ContextMenu is declared as a slot, use
    connect(cb, &QComboBox::customContextMenuRequested, this, &EffectTable::ContextMenu);
    
    1. If not , try this and don't do any mapping in EffectTable::ContextMenu, leave it same as in the top post
        connect(cb, &QComboBox::customContextMenuRequested, [=](QPoint pos){
            QWidget* w = qobject_cast<QWidget*>(sender());
            ContextMenu(w->mapTo(ui->table->viewport(), pos));
        });
    
    M 3 Replies Last reply
    0
    • B Bonnie

      @MasterBlade But that's not the correct way to use sender()

      1. If EffectTable::ContextMenu is declared as a slot, use
      connect(cb, &QComboBox::customContextMenuRequested, this, &EffectTable::ContextMenu);
      
      1. If not , try this and don't do any mapping in EffectTable::ContextMenu, leave it same as in the top post
          connect(cb, &QComboBox::customContextMenuRequested, [=](QPoint pos){
              QWidget* w = qobject_cast<QWidget*>(sender());
              ContextMenu(w->mapTo(ui->table->viewport(), pos));
          });
      
      M Offline
      M Offline
      MasterBlade
      wrote on last edited by
      #11

      @Bonnie

      You are correct. I output sender with

      QObject* obj = sender();
      qDebug() << obj;
      

      and got

      QObject(0x0)
      

      sender is not working in this case.

      1 Reply Last reply
      0
      • B Bonnie

        @MasterBlade But that's not the correct way to use sender()

        1. If EffectTable::ContextMenu is declared as a slot, use
        connect(cb, &QComboBox::customContextMenuRequested, this, &EffectTable::ContextMenu);
        
        1. If not , try this and don't do any mapping in EffectTable::ContextMenu, leave it same as in the top post
            connect(cb, &QComboBox::customContextMenuRequested, [=](QPoint pos){
                QWidget* w = qobject_cast<QWidget*>(sender());
                ContextMenu(w->mapTo(ui->table->viewport(), pos));
            });
        
        M Offline
        M Offline
        MasterBlade
        wrote on last edited by MasterBlade
        #12

        @Bonnie There is a compile error with ContextMenu(w->mapTo(ui->table->viewport(), pos));

        C:\Users\<...>\effecttable.cpp:132: error: non-const lvalue reference to type 'QPoint' cannot bind to a temporary of type 'QPoint'

        I changed it to

        QPoint p = w->mapTo(ui->table->viewport(), pos);
        ContextMenu(p);
        

        and it's running.

        But it again crashed with the same error message.

        B 1 Reply Last reply
        0
        • B Bonnie

          @MasterBlade But that's not the correct way to use sender()

          1. If EffectTable::ContextMenu is declared as a slot, use
          connect(cb, &QComboBox::customContextMenuRequested, this, &EffectTable::ContextMenu);
          
          1. If not , try this and don't do any mapping in EffectTable::ContextMenu, leave it same as in the top post
              connect(cb, &QComboBox::customContextMenuRequested, [=](QPoint pos){
                  QWidget* w = qobject_cast<QWidget*>(sender());
                  ContextMenu(w->mapTo(ui->table->viewport(), pos));
              });
          
          M Offline
          M Offline
          MasterBlade
          wrote on last edited by
          #13

          @Bonnie said in How to get the position of widgets in QTablewidget:

          connect(cb, &QComboBox::customContextMenuRequested, this, &EffectTable::ContextMenu);

          connect(cb, &QComboBox::customContextMenuRequested, this, &EffectTable::ContextMenu);

          has a link error.
          C:\Qt\5.15.0\msvc2019_64\include\QtCore\qobject.h:255: error: C2338: Signal and slot arguments are not compatible.

          1 Reply Last reply
          0
          • B Bonnie

            @MasterBlade Wait! I found that in your code the ContextMenu is not called as a slot.
            So the sender() should not be the comboBox...

            M Offline
            M Offline
            MasterBlade
            wrote on last edited by
            #14

            @Bonnie It's late at night in China and I need to take some sleep.
            Thank you so much for the help.
            I will answer your further responses tomorrow.

            1 Reply Last reply
            0
            • M MasterBlade

              @Bonnie There is a compile error with ContextMenu(w->mapTo(ui->table->viewport(), pos));

              C:\Users\<...>\effecttable.cpp:132: error: non-const lvalue reference to type 'QPoint' cannot bind to a temporary of type 'QPoint'

              I changed it to

              QPoint p = w->mapTo(ui->table->viewport(), pos);
              ContextMenu(p);
              

              and it's running.

              But it again crashed with the same error message.

              B Offline
              B Offline
              Bonnie
              wrote on last edited by Bonnie
              #15

              @MasterBlade I've tried myself. sender() is still 0x0.
              Seems not a good idea to use it in the lambda. We should use cb instead.
              Still in the lambda:

              QPoint p = cb->mapTo(ui->table, pos);
              ContextMenu(p);
              

              And no mapping in ContextMenu.
              I've tried, this works. ;)

              M 2 Replies Last reply
              1
              • B Bonnie

                @MasterBlade I've tried myself. sender() is still 0x0.
                Seems not a good idea to use it in the lambda. We should use cb instead.
                Still in the lambda:

                QPoint p = cb->mapTo(ui->table, pos);
                ContextMenu(p);
                

                And no mapping in ContextMenu.
                I've tried, this works. ;)

                M Offline
                M Offline
                MasterBlade
                wrote on last edited by
                #16

                @Bonnie Oh god this is working!
                Thank you so much!

                1 Reply Last reply
                0
                • B Bonnie

                  @MasterBlade I've tried myself. sender() is still 0x0.
                  Seems not a good idea to use it in the lambda. We should use cb instead.
                  Still in the lambda:

                  QPoint p = cb->mapTo(ui->table, pos);
                  ContextMenu(p);
                  

                  And no mapping in ContextMenu.
                  I've tried, this works. ;)

                  M Offline
                  M Offline
                  MasterBlade
                  wrote on last edited by MasterBlade
                  #17

                  @Bonnie Well there are still some minor problems.

                  I have QComboBox and QPushbutton on the same row.

                  Let's say the first row. Right-clicking the QPushbutton gives row# 0, but QComboBox gives 1.

                  Also for the last row both give -1.

                  They are linked the the same ContextMenu() function.

                  B 1 Reply Last reply
                  0
                  • M MasterBlade

                    @Bonnie Well there are still some minor problems.

                    I have QComboBox and QPushbutton on the same row.

                    Let's say the first row. Right-clicking the QPushbutton gives row# 0, but QComboBox gives 1.

                    Also for the last row both give -1.

                    They are linked the the same ContextMenu() function.

                    B Offline
                    B Offline
                    Bonnie
                    wrote on last edited by Bonnie
                    #18

                    @MasterBlade I've tried again, to get the correct row, we need to map to the viewport, as I expected.
                    So in the lambda

                    QPoint p = cb->mapTo(ui->table->viewport(), pos);
                    ContextMenu(p);
                    

                    I also tried to add a QPushButton, it works fine, too.
                    How did you connect the button?
                    Did you change cb to the button's pointer?

                    M 1 Reply Last reply
                    2
                    • B Bonnie

                      @MasterBlade I've tried again, to get the correct row, we need to map to the viewport, as I expected.
                      So in the lambda

                      QPoint p = cb->mapTo(ui->table->viewport(), pos);
                      ContextMenu(p);
                      

                      I also tried to add a QPushButton, it works fine, too.
                      How did you connect the button?
                      Did you change cb to the button's pointer?

                      M Offline
                      M Offline
                      MasterBlade
                      wrote on last edited by
                      #19

                      @Bonnie
                      After adding viewport everything works perfect!
                      I wish I could give you 100 thumbs up!!!

                      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