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.
  • A Offline
    A Offline
    advseo32
    wrote on last edited by
    #56

    Now it's working

    i need your advises about my implementation, (it's bad ? , it's good ?)
    @void MonTableauWidget::keyPressEvent(QKeyEvent *event)
    {

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

    }
    @

    1 Reply Last reply
    0
    • 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