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. Problems with QComboBox first time

Problems with QComboBox first time

Scheduled Pinned Locked Moved General and Desktop
9 Posts 2 Posters 2.5k Views 2 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.
  • C Offline
    C Offline
    cimer84
    wrote on last edited by
    #1

    We have an QItemDelgate. In the fisrt column I have a comboBox. I want that with one click show popup but the first time the popup dissapear. Do you any solution for this?

    ui->tableViewTma->setItemDelegate(
    			new LrgQComboBoxCapReductionsItemDelegate(reasonList));
    ui->tableViewTma->setModel(tmaCapRedModel);
    
    
    LrgQComboBoxCapReductionsItemDelegate::LrgQComboBoxCapReductionsItemDelegate(QStringList reasonList,QObject *parent) :
    	QItemDelegate(parent)
    {
    	observable = LrbOptimalScheduleObservable::GetInstance();
    	observable->AddObserver(this);
    
    	reason = reasonList;
    }
    
    QWidget* LrgQComboBoxCapReductionsItemDelegate::createEditor(
    		QWidget *parent, const QStyleOptionViewItem &option, const QModelIndex &index) const
    {
    	if(index.column() == 1)
    	{
    		QComboBox* comboBoxTimesIni = new QComboBox(parent);
    		comboBoxTimesIni->installEventFilter(const_cast<LrgQComboBoxCapReductionsItemDelegate*>(this));
    		comboBoxTimesIni->addItems(timesIni);
    		return comboBoxTimesIni;
    	}
    	else if (index.column() == 2)
    	{
    		QComboBox* comboBoxTimesFinal = new QComboBox(parent);
    
    		QString value = index.model()->data(index.model()->index(index.row(),1), Qt::DisplayRole).toString();
    		QStringList timesFinal;
    		int indexValues = timesIni.indexOf(value);
    		if(indexValues == -1)
    		{
    			indexValues = 0;
    		}
    		for (int i = indexValues; i < observable->getOptimalData()->getRunwaySystemMessasge().size(); i++)
    		{
    			Hmi::LriRunwaySystem rs = observable->getOptimalData()->getRunwaySystemMessasgeByIndex(i);
    			timesFinal.push_back(QString::fromStdString(rs.getFinalTime()));
    		}
    		comboBoxTimesFinal->addItems(timesFinal);
    		return comboBoxTimesFinal;
    	}
    	else if ((index.column() == 3) ||
    			 (index.column() == 4) ||
    			 (index.column() == 5))
    	{
    		QLineEdit* lineEdit = new QLineEdit(parent);
    		lineEdit->setValidator( new QIntValidator(1, 100, parent) );
    		return lineEdit;
    	}
    	else if(index.column() == 6)
    	{
    		QComboBox* comboBoxReason = new QComboBox(parent);
    		comboBoxReason->addItems(reason);
    		return comboBoxReason;
    	}
    	else{
    		return QItemDelegate::createEditor(parent, option, index);
    	}
    
    }
    void LrgQComboBoxCapReductionsItemDelegate::setEditorData(
    		QWidget *editor, const QModelIndex &index) const
    {
    	if((index.column() == 1) || (index.column() == 2) || (index.column() == 6))
    	{
    		QString value = index.model()->data(index, Qt::EditRole).toString();
    		QComboBox* comboBox = static_cast<QComboBox*>(editor);
    		comboBox->setCurrentIndex(comboBox->findText(value));
    	}
    	else if ((index.column() == 3) || (index.column() == 4) || (index.column() == 5))
    	{
    		QString value = index.model()->data(index, Qt::EditRole).toString();
    		QLineEdit* lineEdit = static_cast<QLineEdit*>(editor);
    		lineEdit->setText(value);
    	}
    	else
    	{
    		QItemDelegate::setEditorData(editor, index);
    	}
    }
    void LrgQComboBoxCapReductionsItemDelegate::setModelData(
    		QWidget *editor, QAbstractItemModel *model, const QModelIndex &index) const
    {
    	if((index.column() == 1) || (index.column() == 2) || (index.column() == 6))
    	{
    		QComboBox* comboBox = static_cast<QComboBox*>(editor);
    		QString value = comboBox->currentText();
    		model->setData(index, value, Qt::EditRole);
    		//ISE#615
    		if(index.column() == 1)
    		{
    			QModelIndex indexAux = index.model()->index(index.row(), 2);
    			QString value = "";
    			model->setData(indexAux, value, Qt::EditRole);
    		}
    	}
    	else if ((index.column() == 3) || (index.column() == 4) || (index.column() == 5))
    	{
    		QLineEdit* lineEdit = static_cast<QLineEdit*>(editor);
    		QString value = lineEdit->text();
    		model->setData(index, value, Qt::EditRole);
    	}
    	else
    	{
    		QItemDelegate::setModelData(editor, model, index);
    	}
    }
    
    bool LrgQComboBoxCapReductionsItemDelegate::eventFilter(QObject* src, QEvent* evt)
    {
    	if (evt->type() == QEvent::FocusIn)
    	{
    		QComboBox* cb = qobject_cast<QComboBox*> (src);
    		if (cb)
    		{
    			cb->showPopup();
    //important to handle it only the first time, otherwise will result in
    //focus glitches
    			cb->removeEventFilter(this);
    		}
    	}
    	return QItemDelegate::eventFilter(src, evt);
    }
    
    void LrgQComboBoxCapReductionsItemDelegate::Notify()
    {
    	//ISE#385
    	timesIni.clear();
    	//timesFinal.clear();
    	//END ISE#385
    	int intervals =
    			((unsigned)observable->getOptimalData()->getRunwaySystemMessasge().size()
    				< ConstantsRmanHmi::numberOfIntervals) ?
    						observable->getOptimalData()->getRunwaySystemMessasge().size() :
    				ConstantsRmanHmi::numberOfIntervals;
    	for (int i = 0; i < intervals; i++)
    	{
    		Hmi::LriRunwaySystem rs = observable->getOptimalData()->getRunwaySystemMessasgeByIndex(i);
    		timesIni << QString::fromStdString(rs.getIniTime());
    	}
    }
    
    class LrmOneClickTableView: public QTableView
    {
    public:
    	LrmOneClickTableView(QWidget *parent = 0)
    			: QTableView(parent)
    	{
    	   setEditTriggers(QAbstractItemView::EditKeyPressed | QAbstractItemView::SelectedClicked);
    	}
    
    protected:
    	void mousePressEvent(QMouseEvent *event)
    	{
    		if (event->button() == Qt::LeftButton)
    		{
    			QModelIndex index = indexAt(event->pos());
    			if ((index.column() == 1) || (index.column() == 2) || (index.column() == 6))
    			{ // column you want to use for one click
    				setCurrentIndex(index);
    				edit(index);
    			}
    		}
    		QTableView::mousePressEvent(event);
    	}
    };
    
    1 Reply Last reply
    0
    • S Offline
      S Offline
      Sam
      wrote on last edited by
      #2

      Hi,

      You can try calling showPopup() of the combobox where you create the instance like withing createEditor() function.

      Regards,
      Sam

      C 1 Reply Last reply
      0
      • S Sam

        Hi,

        You can try calling showPopup() of the combobox where you create the instance like withing createEditor() function.

        Regards,
        Sam

        C Offline
        C Offline
        cimer84
        wrote on last edited by
        #3

        @Sam If a put showPopup in the createEditor Function I have the same problem. It is only in the first time.

        1 Reply Last reply
        0
        • S Offline
          S Offline
          Sam
          wrote on last edited by
          #4

          @cimer84

          The editTriggers for the tableView is set to QAbstractItemView::EditKeyPressed | QAbstractItemView::SelectedClicked means the createEditor function is called only when the item is already selected. So in your case the first click will select and the second click will call the createEditor(). Can you check with setting the editTriggers to QAbstractItemView::AllEditTriggers

          C 1 Reply Last reply
          0
          • S Sam

            @cimer84

            The editTriggers for the tableView is set to QAbstractItemView::EditKeyPressed | QAbstractItemView::SelectedClicked means the createEditor function is called only when the item is already selected. So in your case the first click will select and the second click will call the createEditor(). Can you check with setting the editTriggers to QAbstractItemView::AllEditTriggers

            C Offline
            C Offline
            cimer84
            wrote on last edited by
            #5

            @Sam the same.

            I think that the problem is with de signals that combo or something like that emit. But I don't now why the first time pop up appear and dissapear and the others only appear and I have to click one more time to dissapear.

            1 Reply Last reply
            0
            • S Offline
              S Offline
              Sam
              wrote on last edited by
              #6

              Okay,

              I tested with a sample project the showPopup() of the combobox needs to be called in the setEditorData()

                  {
                      QString value = index.model()->data(index, Qt::EditRole).toString();
                      QComboBox* comboBox = static_cast<QComboBox*>(editor);
                      comboBox->setCurrentIndex(comboBox->findText(value));
              	comboBox->showPopup();
                  }
              
              C 1 Reply Last reply
              0
              • S Sam

                Okay,

                I tested with a sample project the showPopup() of the combobox needs to be called in the setEditorData()

                    {
                        QString value = index.model()->data(index, Qt::EditRole).toString();
                        QComboBox* comboBox = static_cast<QComboBox*>(editor);
                        comboBox->setCurrentIndex(comboBox->findText(value));
                	comboBox->showPopup();
                    }
                
                C Offline
                C Offline
                cimer84
                wrote on last edited by
                #7

                @Sam I put this one in the setEditorData but the problem continue. Do you test in windows or Linux. I think that the problem is the S.O because in windows the problem is not appear.

                1 Reply Last reply
                0
                • S Offline
                  S Offline
                  Sam
                  wrote on last edited by
                  #8

                  @cimer84

                  Yes, i test on windows 8.1 Qt 5.4.1 mvsc2010 .

                  C 1 Reply Last reply
                  0
                  • S Sam

                    @cimer84

                    Yes, i test on windows 8.1 Qt 5.4.1 mvsc2010 .

                    C Offline
                    C Offline
                    cimer84
                    wrote on last edited by
                    #9

                    @Sam I test with Linux with 4.8 version. can it be the problem?

                    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