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. Changing an image using QStyledItemDelegate in TableView
Forum Updated to NodeBB v4.3 + New Features

Changing an image using QStyledItemDelegate in TableView

Scheduled Pinned Locked Moved Unsolved General and Desktop
21 Posts 4 Posters 5.3k Views 3 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.
  • VRoninV Offline
    VRoninV Offline
    VRonin
    wrote on last edited by
    #12

    Looks like you forgot some #includes, added them to my original post

    "La mort n'est rien, mais vivre vaincu et sans gloire, c'est mourir tous les jours"
    ~Napoleon Bonaparte

    On a crusade to banish setIndexWidget() from the holy land of Qt

    G 1 Reply Last reply
    0
    • VRoninV VRonin

      Looks like you forgot some #includes, added them to my original post

      G Offline
      G Offline
      gabor53
      wrote on last edited by
      #13

      @VRonin
      I have in the .h file:

      virtual void setEditorData(QWidget *editor, const QModelIndex &index);
      

      In the .cpp:

      void ImageDelegate::setEditorData(QWidget *editor, const QModelIndex &index)
      {
          ImagePickButton* imgPick = qobject_cast<ImagePickButton*>(editor);
          Q_ASSERT(imgPick);
          imgPick->setSelectedFile(index.data(Qt::UserRole));
      }
      

      It gives me the following error message:
      C:\Programming\Projects\Folkfriends_1_0\imagedelegate.cpp:18: error: no matching function for call to 'ImagePickButton::setSelectedFile(QVariant)'
      imgPick->setSelectedFile(index.data(Qt::UserRole));

                                                        ^
      

      C:\Programming\Projects\Folkfriends_1_0\imagedelegate.h:4: In file included from ..\Folkfriends_1_0\imagedelegate.h:4:0,
      C:\Programming\Projects\Folkfriends_1_0\imagedelegate.cpp:1: from ..\Folkfriends_1_0\imagedelegate.cpp:1:
      C:\Programming\Projects\Folkfriends_1_0\imagepickbutton.h:18: candidate: void ImagePickButton::setSelectedFile(const QString&)
      void setSelectedFile(const QString& val);
      ^
      C:\Programming\Projects\Folkfriends_1_0\imagepickbutton.h:18: note: no known conversion for argument 1 from 'QVariant' to 'const QString&'

      What should I change? Everything else builds correctly.

      1 Reply Last reply
      0
      • p3c0P Offline
        p3c0P Offline
        p3c0
        Moderators
        wrote on last edited by
        #14

        @gabor53 setSelectedFile expects a QString parameter so convert the QVariant returned by data to QString.

        157

        1 Reply Last reply
        1
        • VRoninV Offline
          VRoninV Offline
          VRonin
          wrote on last edited by
          #15

          easy fix imgPick->setSelectedFile(index.data(Qt::UserRole).toString());

          "La mort n'est rien, mais vivre vaincu et sans gloire, c'est mourir tous les jours"
          ~Napoleon Bonaparte

          On a crusade to banish setIndexWidget() from the holy land of Qt

          G 1 Reply Last reply
          2
          • VRoninV VRonin

            easy fix imgPick->setSelectedFile(index.data(Qt::UserRole).toString());

            G Offline
            G Offline
            gabor53
            wrote on last edited by
            #16

            @VRonin
            Thank you. This part works now. I added

            ImagePickButton *myImagePickButton = new ImagePickButton(this);
            myImagePickButton->show();
            

            to mydeelgate.cpp createEditor.

            When the user clicks on the image now it creates the button saying "Select Image". But this button is not on the view; it is separated from it and appears in the top left corner of the screen. How can I add it to the view so the button is on the actual image the user is trying to change? Thank you.

            1 Reply Last reply
            0
            • VRoninV Offline
              VRoninV Offline
              VRonin
              wrote on last edited by
              #17

              do not call show() just return that widget from that method. Again I'd advise you just to use the code I posted above even for the delegate

              "La mort n'est rien, mais vivre vaincu et sans gloire, c'est mourir tous les jours"
              ~Napoleon Bonaparte

              On a crusade to banish setIndexWidget() from the holy land of Qt

              G 1 Reply Last reply
              1
              • VRoninV VRonin

                do not call show() just return that widget from that method. Again I'd advise you just to use the code I posted above even for the delegate

                G Offline
                G Offline
                gabor53
                wrote on last edited by
                #18

                @VRonin
                I definitely want to use the code you posted. Should I call the method returning the widget from myDelegate.cpp or from fixdb.cpp where the model is set up? Currently I have this:

                 ui->tableView_Fix->setItemDelegate (new myDelegate);
                

                This declares that the delegate will be myDelegate from now on for everything. Can this work somehow ?

                    ui->tableView_Fix->setItemDelegateForColumn(3, new ImageDelegate);
                    ui->tableView_Fix->setItemDelegate (new myDelegate);
                

                Saying that if column 3 is chosen go with ImageDelegate; all other cases myDelegate.
                It this is the way, what is missing? Currently it opens a text window in column 4). Thank you.

                1 Reply Last reply
                0
                • VRoninV Offline
                  VRoninV Offline
                  VRonin
                  wrote on last edited by
                  #19

                  do it the other way around and do not leak memory:

                      ui->tableView_Fix->setItemDelegate (new myDelegate(this));
                  ui->tableView_Fix->setItemDelegateForColumn(3, new ImageDelegate(this));
                  
                  

                  "La mort n'est rien, mais vivre vaincu et sans gloire, c'est mourir tous les jours"
                  ~Napoleon Bonaparte

                  On a crusade to banish setIndexWidget() from the holy land of Qt

                  G 2 Replies Last reply
                  0
                  • VRoninV VRonin

                    do it the other way around and do not leak memory:

                        ui->tableView_Fix->setItemDelegate (new myDelegate(this));
                    ui->tableView_Fix->setItemDelegateForColumn(3, new ImageDelegate(this));
                    
                    
                    G Offline
                    G Offline
                    gabor53
                    wrote on last edited by gabor53
                    #20
                    This post is deleted!
                    1 Reply Last reply
                    0
                    • VRoninV VRonin

                      do it the other way around and do not leak memory:

                          ui->tableView_Fix->setItemDelegate (new myDelegate(this));
                      ui->tableView_Fix->setItemDelegateForColumn(3, new ImageDelegate(this));
                      
                      
                      G Offline
                      G Offline
                      gabor53
                      wrote on last edited by
                      #21

                      @VRonin
                      So far I came across 2 problems.

                      1. If I add
                      ui->tableView_Fix->setItemDelegateForColumn(3, new ImageDelegate(this));
                      

                      to fixdb.cpp , nothing happens, because myDelegate.cpp evaluates which cell the user clicked on. I can add

                      return new ImagePickButton(parent);
                      

                      to myDelegate createEditor and it returns the button, but I couldn't figure out how to connect imageDelegate to the existing code. Please advise which is the best solution.

                      1. The button is about 10px smaller on the top and on the left than the original cell. How can I make it bigger to cover the size of the original cell (originally its 100 x 100). It doesn't respond to any of the size settings.
                        Thank you for your help.
                      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