Custom editor for a delegate



  • Hi.
    Im trying to make a custom editor for a delegate in a tableview. I tried to subclass QWidget and use it as a editor. Problem is, when i start it standalone, if works. If i pass it in the delegates createEditor and setEditorData, its blinks fast and goes right to setModelData without waiting for input. and its shown as a regulan window, but i want it without the close, minimize and fullscreen buttons and right on the top over my tableview where i startet it and in a size i spezify without disturbing the tableview. I think i dont get the basics right. Can someone give me an outline how i have to define my class for that and what function i need to implement or override?


  • Qt Champions 2016

    hi
    ". and its shown as a regular window, "

    Are you sure u assign a parent?

    QWidget *myw=new QWidget(this); // "this" is parent

    QWidget *myw=new QWidget(); // no parent /default NULL)



  • No))) Well i was, but i forgot to call standard constructor from QWidget in my cpp. Now it pressing my editor in the cell of the tableview. Can i draw on top of the view?



  • To add to what @mrjj mentioned with the parent: You are actually supposed to assign the parent passed to the createEditor() function:

    QWidget* ComboboxDelegate::createEditor(QWidget* parent, const QStyleOptionViewItem& option, const QModelIndex& index) const
    {
        Q_UNUSED(option)
        Q_UNUSED(index)
    
        QComboBox* combobox = new QComboBox(parent);
        combobox->addItems({"Foo", "Bar", "mrjj"});
    
        return combobox;
    }
    


  • @Joel. yes, i did.


  • Qt Champions 2016

    @Maser said:

    Can i draw on top of the view?

    yes , you can override paintEvent and call base paint then then draw your self but
    often there are better ways :)

    Can I ask why you want to draw on view?



  • Well, my editor contains a number of images, from where i can choose one or several. as a markup that images are chosen i draw a red circle, around the activated ones. And the pictures are bigger, so they dont fit in the cell and the cell have to be resized when i draw it in the cell. So i figured i just draw it on top with a predefined size of a editorwidget.


  • Qt Champions 2016

    @Maser
    ok. So its when you select the images, you want to draw over the view ? or
    after you selected an image?

    Im not sure how will it will work with scrolling etc.



  • No, no. I want my editor widget drawn on top when i start editing the cell. After i made the editing, the editor is gone and the changed state or whatever in inside the cell. Just for editing.



  • So any suggestions how i do this painting over? I suppose i have to somehow get the coordinates of the cell, then draw a barebone widget und maybe adjust it in the tableview frame. But i dont know where to start. Are there some examples on that?


  • Qt Champions 2016

    @Maser
    Hi,
    Maybe you should look into a delegate ?
    http://doc.qt.io/qt-5/qtwidgets-itemviews-stardelegate-example.html

    A delegate is the normal way to change how content is drawn in each cell.

    Painting on the actual view will often have side effects with scrolling etc.

    If you want to see, you will override the paintEvent virtual function
    and paint there.



  • Im using a delegate. but i want the editor of the delegate drawn over the cell. I just need a hin how i connect the coordinates and draw a barebone widget. In wont have to be scrollable (yet).


  • Qt Champions 2016

    @Maser

    Ok. Im not really following what u need. sorry.

    In any case, you can override paintEvent for any widget and draw.
    Notice that you cannot draw outside of the widgets client area so
    make sure u override the paint for the actual widget u want to draw on.



  • It seems overriding paintevent doesnt work. What does work(at least partially) is reimplementing updateEditorGeometry from the delegate. When i give the specific cell a bigger size for the editor it paints it bigger. Even the choosing works, but not when there is another cell under from the tableview under my editor-buttons. Dont yet know how to solve that.


  • Qt Champions 2016

    @Maser
    ok, can we see pic ?



  • http://www.picfront.org/d/9q7X
    I marked the cell from which the editor has been activated. Problem is, as long is the items are of this cell or outside of the table, i can click them. if the are above other cells, the editor closes.


  • Qt Champions 2016

    @Maser
    Could you not just pop a dialog with
    all the images and let user select one?

    Or use a combobox with a delegate ?
    http://www.qtcentre.org/threads/26376-Using-images-in-QComboBox



  • This is a good idea)
    But since im trying to learn Qt, i will save it for the emergency plan)
    When i have a customer who wants it the exact way he described it, i wanna know how to do it, no matter of the cost)
    Have you an idea why the over cells interfere with my editor and how i can solve it?


  • Qt Champions 2016

    @Maser said:

    Have you an idea why the over cells interfere with my editor and how i can solve it?

    I assume that click goes to real cell as the images is just painted over it
    so u can not click on them as such.



  • No, i can. I told you. if i aim right in the black marked cell, i can click and unclick the three left items, i can also click the three right items. Just when i click anywhere in the tablecells, the editor is gone.

    PS: Maybe i have to somehow resize the "working area" of the cell to to fit my editor. I mean the clickable area associated with the cell. Idea on that?


  • Qt Champions 2016

    @Maser
    Hi
    The cell has the size it has.

    The Editor can be anything so it should be possible
    to float a transparent widget where u paint the pics
    and get the selection.

    Can u show code for editor creation ?



  • class ClickableIconHolder : public QWidget
    {
        Q_OBJECT
    public:
        ClickableIconHolder(uint Mark, QWidget *parent = 0);
        QSize sizeHint() const Q_DECL_OVERRIDE;
    signals:
        void editingFinished();
    protected:
        void paintEvent(QPaintEvent *event) Q_DECL_OVERRIDE;
    private:
        QHBoxLayout *hbLayout;
        ClickableIcon *ci1 = 0;
        ClickableIcon *ci2 = 0;
        ClickableIcon *ci3 = 0;
        ClickableIcon *ci4 = 0;
        ClickableIcon *ci5 = 0;
        ClickableIcon *ci6 = 0;
        ClickableIcon *ci7 = 0;
    };
    

    Here is the header of the editor-widget. I create some clickable QLabel and add them to a HBoxLayout, thats all in general. I dont do nothing in the paintevent yet.



  • I tried to go cardcore and draw the widget myself, with no parent pased to it, but the problem is, the delegate doesnt wait for my editor to pass the data, whem im not making the editor delegates child. Im afraid for that id have to dig deep in the delegates sourcecode...


  • Qt Champions 2016

    @Maser
    well unless u want to use the normals means (combo / popup dialog)
    then yes i think
    you should look around in delegate code to get good idea.



  • Nah, that would be a waste of time at this point. I just took QDialog as a parentclass to my editor, now i can click everything and after i positioned it, it stays where it should be. Im not done yet completly implementing it, but the appearance(apart of some big margins for the boundaries) is quite what i wanted.
    Thanks so far))


  • Qt Champions 2016

    @Maser
    please post final look :)



  • http://www.picfront.org/d/9q8q
    That is the look now. I added a Qt::FramelessWindowHint flag and this seems to be the minimal size. I have not figured out yet how to reduze the margins.


  • Qt Champions 2016

    @Maser
    Ok . looks nice.
    Did you use a layout ?
    It has margins.
    http://doc.qt.io/qt-5/qlayout.html#setContentsMargins

    "On most platforms, the margin is 11 pixels in all directions."



  • yes, the hboxlayout. Ok, i set the margins now. Looks better. Thanks again))


Log in to reply
 

Looks like your connection to Qt Forum was lost, please wait while we try to reconnect.