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. [SOLVED] Insert row from Qtableview to another
Forum Updated to NodeBB v4.3 + New Features

[SOLVED] Insert row from Qtableview to another

Scheduled Pinned Locked Moved General and Desktop
68 Posts 3 Posters 34.5k 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.
  • SGaistS Offline
    SGaistS Offline
    SGaist
    Lifetime Qt Champion
    wrote on last edited by
    #57

    [quote author="JKSH" date="1375283945"] Unfortunately, QEvent::EnterEditFocus is not available in normal Qt builds — the QT_KEYPAD_NAVIGATION macro is not enabled.[/quote]

    Right ! I forgot about that one

    Quick code review (not talking about whether it works)
    Your variables name doesn't seem to follow a coding style, use camel case everywhere will make it more readable (there are different styles but that's another story let's use this one). Also even if this is code have a good grammar/orthography:

    @int currentRows = this->currentRow(); @

    currentRows implies that there are several rows implicated which is not the case following your statement.

    @int lastRow = qMax(0, this->rowCount() -1);@

    You should also refactor your tests, using one liner like that doesn't make the code readable, especially if in the end the second choice is the same as the else code.

    @
    if (this->item(LastRow,0) != 0) &&
    lastRow == currentRows)
    this->insertRow(this->rowCount());
    else
    QTableWidget::keyPressEvent(event);
    @

    If you have a test that is done repeatedly you can also use a variable with a meaningful name

    @bool isCurrentRowLast = (lastRow == currentRow);@

    Don't forget that the code you are writing now might be the same code that you'll have to read in a year. Being able to go through it without having to do deep analyzes to understand what is does will prove valuable also for your co-workers.

    Interested in AI ? www.idiap.ch
    Please read the Qt Code of Conduct - https://forum.qt.io/topic/113070/qt-code-of-conduct

    1 Reply Last reply
    0
    • A Offline
      A Offline
      advseo32
      wrote on last edited by
      #58

      Her is my code , after your advices

      @void MonTableauWidget::keyPressEvent(QKeyEvent *event)
      {

      int LastRow =qMax(0,this->rowCount()-1);
      int CurrentRow = this->currentRow() ;
      bool isCurrentRowLast = (LastRow == CurrentRow);
      bool isCurrentCellEmpty = this->item(LastRow,1) == 0;
      QTableWidgetItem * item = new QTableWidgetItem() ;
      switch (event->key()) {
      case Qt::Key_Down :
          if( !isCurrentCellEmpty)
            (isCurrentRowLast) ? this->insertRow(this->rowCount()) : QTableWidget::keyPressEvent(event) ;
          else
            QTableWidget::keyPressEvent(event);
          break;
      case Qt::Key_Up :
          if(LastRow > 0 && isCurrentCellEmpty)
           isCurrentRowLast ? this->removeRow(LastRow) : QTableWidget::keyPressEvent(event) ;
          else
            QTableWidget::keyPressEvent(event);
          break;
      default:
          item->setIcon( *(new QIcon("imgs/Edit-icon.png")));
          this->setVerticalHeaderItem(CurrentRow,item);
          QTableWidget::keyPressEvent(event);
          break;
      }
      

      }@

      1 Reply Last reply
      0
      • JKSHJ Offline
        JKSHJ Offline
        JKSH
        Moderators
        wrote on last edited by
        #59
        1. This is a memory leak:
          @
          item->setIcon( *(new QIcon("imgs/Edit-icon.png")));
          @
          setIcon() will make a copy of your icon, but the original stays in memory forever.

        2. Your variable names have mixed style -- some start with upper-case (e.g. CurrentRow), but some start with lower-case (e.g. isCurrentRowLast). Choose one style and don't mix them.

        In Qt's style, all function names and variable names start with lower-case, and all class names start with upper-case.

        1. Your checking is complicated:
          @
          if( !isCurrentCellEmpty)
          (isCurrentRowLast) ? this->insertRow(this->rowCount()) : QTableWidget::keyPressEvent(event) ;
          else
          QTableWidget::keyPressEvent(event);
          @
          Just write if (!isCurrentCellEmpty && isCurrentRowLast). Your other case has the same issue.

        Qt Doc Search for browsers: forum.qt.io/topic/35616/web-browser-extension-for-improved-doc-searches

        1 Reply Last reply
        0
        • A Offline
          A Offline
          advseo32
          wrote on last edited by
          #60

          Ok

          this my final version (Thank's for your advices )

          @void MonTableauWidget::keyPressEvent(QKeyEvent *event)
          {

          int LastRow =qMax(0,this->rowCount()-1);
          int CurrentRow = this->currentRow() ;
          bool IsCurrentRowLast = (LastRow == CurrentRow);
          bool IsCurrentCellEmpty = this->item(LastRow,1) == 0;
          QTableWidgetItem * item = new QTableWidgetItem() ;
          QIcon *ShowEditSignIcon = new QIcon("imgs/Edit-icon.png");
          switch (event->key()) {
          case Qt::Key_Down :
              if(IsCurrentRowLast && !IsCurrentCellEmpty)
                this->insertRow(this->rowCount()) ;
              else
                QTableWidget::keyPressEvent(event);
              break;
          case Qt::Key_Up :
              if(LastRow > 0 && IsCurrentCellEmpty && IsCurrentRowLast)
               this->removeRow(LastRow) ;
              else
                QTableWidget::keyPressEvent(event);
              break;
          default:
              item->setIcon(*ShowEditSignIcon);
              delete ShowEditSignIcon;
              this->setVerticalHeaderItem(CurrentRow,item);
              QTableWidget::keyPressEvent(event);
              break;
          }
          

          }
          @

          1 Reply Last reply
          0
          • JKSHJ Offline
            JKSHJ Offline
            JKSH
            Moderators
            wrote on last edited by
            #61

            That looks a lot tidier, well done :)

            You don't have to create a QIcon on the heap with new QIcon(). Just create it on the stack (no pointer) with QIcon ShowEditSignIcon("imgs/Edit-icon.png"); -- then you don't have to delete it yourself.

            Qt Doc Search for browsers: forum.qt.io/topic/35616/web-browser-extension-for-improved-doc-searches

            1 Reply Last reply
            0
            • A Offline
              A Offline
              advseo32
              wrote on last edited by
              #62

              Thank's JKSH and SGaist, now i can be said, i have figured out more than 30% of Model/view architecture in Qt

              if i have another question, i will post her , i will create another thread ?

              1 Reply Last reply
              0
              • JKSHJ Offline
                JKSHJ Offline
                JKSH
                Moderators
                wrote on last edited by
                #63

                You're welcome. Good luck with Qt programming. :)

                You should start new threads for new topics. Remember to provide details of what you already tried.

                Qt Doc Search for browsers: forum.qt.io/topic/35616/web-browser-extension-for-improved-doc-searches

                1 Reply Last reply
                0
                • A Offline
                  A Offline
                  advseo32
                  wrote on last edited by
                  #64

                  i start use the same strategy as we did with Qtablewidget but

                  there is no setVerticalHeaderItem(row,item) function like Qtablewidget(it seems that QtableWidget is very easy than Qtableview

                  my question her :

                  should i sublcass QHeaderView class and implement neccessary function
                  after setting up vertical header @setVerticalHeader(QHeaderView * header)@

                  or i can use another solution with out subclassing QheaderView ???

                  1 Reply Last reply
                  0
                  • A Offline
                    A Offline
                    advseo32
                    wrote on last edited by
                    #65

                    i have used this but no thing happened

                    i use Qtableview with Qsqlquerymodel

                    her is my code
                    @ui->tableView->verticalHeader()->model()->
                    setData(ui->tableView->verticalHeader()->model()->index(1,1),"**",Qt::DisplayRole) ;
                    @

                    1 Reply Last reply
                    0
                    • JKSHJ Offline
                      JKSHJ Offline
                      JKSH
                      Moderators
                      wrote on last edited by
                      #66

                      [quote author="advseo32" date="1375355486"]if i have another question, i will post her , i will create another thread ?[/quote]Why did you ask this question and then ignore my answer?

                      Qt Doc Search for browsers: forum.qt.io/topic/35616/web-browser-extension-for-improved-doc-searches

                      1 Reply Last reply
                      0
                      • A Offline
                        A Offline
                        advseo32
                        wrote on last edited by
                        #67

                        i have posted this question because is similaire topic but now is Qtableview

                        Sorry, if i'm wrong , i will post another thread :)

                        1 Reply Last reply
                        0
                        • JKSHJ Offline
                          JKSHJ Offline
                          JKSH
                          Moderators
                          wrote on last edited by
                          #68

                          [quote author="advseo32" date="1375434213"]i have posted this question because is similaire topic but now is Qtableview

                          Sorry, if i'm wrong , i will post another thread :)[/quote]Yes, please post in a new thread. It is NOT similar.

                          Each thread is supposed to have 1 topic, but you already have 5 topics:

                          How to automatically insert a row at the end when the user clicks/presses a key there

                          How to check if a cell is empty

                          How to add custom symbols to the vertical header

                          How to check if the user selects a different row

                          How to check if the user has started typing into a row

                          (Your new topic) How to modify headers

                          The title of this thread is "Insert row from Qtableview to another", but topics 2-6 are not related to this.

                          Forums let users search old topics to find solutions solutions. But, if a thread has many topics that are not related to the title, it's hard for someone to search.

                          Qt Doc Search for browsers: forum.qt.io/topic/35616/web-browser-extension-for-improved-doc-searches

                          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