how can i get Delegate for QTableWidget?



  • @mrjj but again same problem raising.



  • @mrjj The view does not take ownership of the delegate so you have to give a parent to comDel or it will leak


  • Qt Champions 2016

    @VRonin
    Thanks. I thought setItemDelegateForColumn would - so thats a very good point;
    (Docs clearly states it do not so assumption is the mother of all fups :)


  • Qt Champions 2016

    @srikanth
    Hi
    You changed to use new?
    So what is the exact issue?
    No deletegate is shown, or ?



  • @mrjj the error is showing like this "Unhandled exception at 0x778e3560 in add or remove colmns.exe:0xC00000FD:Stack overflow. "
    and i make changes like this as you said

    void Notepad::test() 
    {	
    	QTableWidgetItem* tableItem = new QTableWidgetItem();
    	
    	table->setRowCount(1);
    	table->setColumnCount(3);
    	table->setItem(0,0,new QTableWidgetItem());
    	table->setItem(0,1,new QTableWidgetItem());
    	table->setItem(0,2,new QTableWidgetItem());
    
    	table->setMouseTracking(true);
        table->viewport()->setMouseTracking(true);
        table->installEventFilter(this);
        table->viewport()->installEventFilter(this);
    
        table->setSelectionBehavior(QAbstractItemView::SelectRows);
        table->setSelectionMode(QAbstractItemView::SingleSelection);
    	
    	QStandardItemModel model((table->rowCount()),(table->columnCount()));
    	//SpinBoxDelegate sdelegate;
    	SpinBoxDelegate *sdelegate = new SpinBoxDelegate ();
    	ComboBoxDelegate * comDel = new ComboBoxDelegate ();
    	//ComboBoxDelegate comDel;
    	 for (int row = 0; row < 4; ++row)
    	{
    		QWidget *parent;
    		QStyleOptionViewItem option;
            for (int column = 0; column < 1; ++column)
    		{
    			
    			table->setItemDelegateForColumn( column, comDel);
    			QModelIndex index = model.index(row, column, QModelIndex());
                model.setData(index, QVariant((row + 1) * (column + 1)));
            }
    		for (int column = 1; column < 2; ++column) 
    		{
    		
    		table->setItemDelegateForColumn( column, sdelegate  );
    		QModelIndex index = model.index(row, column, QModelIndex());
            model.setData(index, QVariant((row + 1) * (column + 1)));
    		}
    	}
    
    
    	table->setHorizontalHeaderItem(0, new QTableWidgetItem("combobox"));
    	table->setHorizontalHeaderItem(1, new QTableWidgetItem("spinbox"));
    	table->setHorizontalHeaderItem(2, new QTableWidgetItem("lineEdit"));
    	tableItem->setFlags(tableItem->flags() ^ Qt::ItemIsEditable);
    	table->setSizePolicy(QSizePolicy::Expanding,QSizePolicy::Expanding);
    	setCentralWidget(table);
    	
    }
    

  • Qt Champions 2016

    Hi
    That is a bug in your code, most likely.

    Please use debugger and single step to find the line
    that gives it.

    Its very hard to guess by looking at code.

    You get a Stack overflow - which often is a infinite loop or something like that.



  • This post is deleted!


  • @mrjj 0_1472446858318_Untitled.jpg

    am getting error like this am not able to find where the error is , please help me.


  • Qt Champions 2016

    @srikanth
    Most likely in your delegate.
    You can insert break point in each function and single step when you reach it.
    That way you can find where it crashes.
    No way i can just guess it, sadly.

    if you think it crash in Notepad::test()
    single step should find it.



  • Just wondering, but it seems you add a columnDelegate for every row you pass through. If I'm not mistaken, you should add a columnDelegate just once for the entire column.

    And you seem to use a for-statement for setting the columDelegate, while you only execute it once. That doesn't make sense to me.

    I'm not sure if this would fix anything of your problem, but I think you're code would benefit from it if you if you fixed this.



  • @mrjj i did debug by using break points, everything is working fine , in .cpp file up to return app.exec(); in main.cpp , here it is getting crash and showing this error.



  • @Jan-Willem thanks a lot the error is fix, when i put for loop in a comment , now how can i assign ComboBoxDelegate for 1st column and SpinBoxDelegate to 2nd cloumn.


  • Qt Champions 2016

    @srikanth
    hi
    Sounds like you crash when close down then/cleaning up.
    I think
    @Jan-Willem has a point of you setting multiple times.
    setItemDelegateForColumn( column, comDel);
    It might delete it multiple times.
    So please try set only once. (for test)



  • In addidtion to @mrjj, I would suggest before or after the entire

    for (int row = 0; row < 4; ++row)
    


  • @Jan-Willem now i get clear idea this error is coming when am trying to insert a delegate into column , so i want to know is there any thing wrong to insert delegates into the tablewidget, please help me to get out from this task . @mrjj



  • How does your code look like now, something like this?

    void Notepad::test() 
    {	
    	QTableWidgetItem* tableItem = new QTableWidgetItem();
    	
    	table->setRowCount(1);
    	table->setColumnCount(3);
    	table->setItem(0,0,new QTableWidgetItem());
    	table->setItem(0,1,new QTableWidgetItem());
    	table->setItem(0,2,new QTableWidgetItem());
    
    	table->setMouseTracking(true);
            table->viewport()->setMouseTracking(true);
            table->installEventFilter(this);
            table->viewport()->installEventFilter(this);
    
            table->setSelectionBehavior(QAbstractItemView::SelectRows);
            table->setSelectionMode(QAbstractItemView::SingleSelection);
    	
    	QStandardItemModel model((table->rowCount()),(table->columnCount()));
    	SpinBoxDelegate *sdelegate = new SpinBoxDelegate ();
    	ComboBoxDelegate * comDel = new ComboBoxDelegate ();
    
    	 for (int row = 0; row < 4; ++row) {
                   for (int col = 0; col < 2; ++col) {
                         QModelIndex index = model.index(row, col, QModelIndex());
                         model.setData(index, QVariant((row + 1) * (col + 1)));
    	}
            table->setItemDelegateForColumn(0,  comDel);
            table->setItemDelegateForColumn(1, sdelegate);
    
    	table->setHorizontalHeaderItem(0, new QTableWidgetItem("combobox"));
    	table->setHorizontalHeaderItem(1, new QTableWidgetItem("spinbox"));
    	table->setHorizontalHeaderItem(2, new QTableWidgetItem("lineEdit"));
    	tableItem->setFlags(tableItem->flags() ^ Qt::ItemIsEditable);
    	table->setSizePolicy(QSizePolicy::Expanding,QSizePolicy::Expanding);
    	setCentralWidget(table);
    }
    


  • @Jan-Willem yeah my code is like this only, but delegates are not assigning to the columns of table widget?



  • The comDel is assigned to the entire column at index 0 with table->setItemDelegateForColumn(0, comDel).



  • @Jan-Willem but that delegate is not assigned to columns of table widget .



  • Just for my curiosity?
    Which version of Qt are you using?



  • @Jan-Willem qt 4.8.3 on Visual Studio 2010

    and my code looks like this

    void Notepad::test() 
    {	    
    	
    	QTableWidgetItem* tableItem = new QTableWidgetItem();
    	
    	table->setRowCount(1);
    	table->setColumnCount(3);
    	table->setItem(0,0,new QTableWidgetItem());
    	table->setItem(0,1,new QTableWidgetItem());
    	table->setItem(0,2,new QTableWidgetItem());
    
    	table->setMouseTracking(true);
        table->viewport()->setMouseTracking(true);
        table->installEventFilter(this);
        table->viewport()->installEventFilter(this);
    
    	table->setSelectionBehavior(QAbstractItemView::SelectRows);
        table->setSelectionMode(QAbstractItemView::SingleSelection);
    	
    	QStandardItemModel model((table->rowCount()),(table->columnCount()));
    	//SpinBoxDelegate sdelegate;
    	//ComboBoxDelegate comDel;
    	int newrow =table->rowCount();
    	int newcol =table->columnCount();
    
    
    	SpinBoxDelegate *sdelegate = new SpinBoxDelegate ();
    	ComboBoxDelegate * comDel = new ComboBoxDelegate ();
    
    	 for (int row = 0; row < 1; ++row) {
                   for (int col = 0; col < 3; ++col) {
    				 
                         QModelIndex index = model.index(row, col, QModelIndex());
                         model.setData(index, QVariant((row + 1) * (col + 1)));
    	table->setItemDelegateForColumn( newcol, comDel);
    			   }
      
    	 }
    	/*for (int row = 0; row < 4; ++row)
    	{
    table->setItemDelegateForColumn( 2, &sdelegate);
    	}*/
    
         	table->setHorizontalHeaderItem(0, new QTableWidgetItem("combobox"));
    	table->setHorizontalHeaderItem(1, new QTableWidgetItem("spinbox"));
    	table->setHorizontalHeaderItem(2, new QTableWidgetItem("lineEdit"));
    	tableItem->setFlags(tableItem->flags() ^ Qt::ItemIsEditable);
    	table->setSizePolicy(QSizePolicy::Expanding,QSizePolicy::Expanding);
    	setCentralWidget(table);
    }
    


  • Alright. Frankly I think you are making things more difficult than they have to be.

    First of all you shouldn't set the columndelegate inside the for-statement, since you set it multiple times for no reason. Once will do for the entire column, so do it before or after the for-statement.

    Second, you create a QStandardItemModel and use it with a QTabelWidget. A QTableWidget has it's own internal model.
    The QModelIndex returned by model.index(row, col, QModelIndex()) is not in your table, but in your QStandardItemModel.

    Perhaps you should read this first: Model/View Programming



  • @Jan-Willem @mrjj Thank you very much. problem is solved. your right am making things difficult , thanks for your advice it makes me to keen observe of my code and solve , Thanks a lot.
    Can't believe that there is people who spend their time for such noob as me. Thank you again.



  • Glad it works so far.
    Good luck with the rest.


Log in to reply
 

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