[Qt-interest] Tree Item view Highlighter

Sajjad dosto.walla at gmail.com
Tue Jan 11 10:32:32 CET 2011


Hello forum,


I am trying to highlight a particular tree item based on the string pattern
entered by the user. To get this effect i subclassed the
QSortFilterProxyModel and over-rid the data() function.

Then inside a slot whenever the string in the line edit changes i am
emitting the signal dataChanged(....).
And here i am confused about the  value to pass as the model indexes. I am
doing it now as follows:

/////////////////////////////////////////////////////////////////////////////////////////////////////////////////

  void H3DNodeListWidget::highlightRegExpChanged()

{

    QRegExp regExp(m_nodeHighlightingEditor->text(),Qt::CaseInsensitive,QRegExp::FixedString);

    m_highlightModel->setFilterRegExp(regExp);

    const QModelIndex topLeft = m_highlightModel->index(0,0,QModelIndex());

    const QModelIndex bottomRight =
m_highlightModel->index(0,m_highlightModel->columnCount()-1,QModelIndex());


    emit proxyModelHighlightChanged(topLeft,bottomRight);


}



//////////////////////////////////////////////////////////////////////////////////////////////////////////////////


But i am not getting the effect i am looking for.


Regards
Sajjad





On Mon, Jan 10, 2011 at 3:26 PM, Sajjad <dosto.walla at gmail.com> wrote:

> Hello,
>
> I am back to the same thread after quite a while. I am kind of confused
> about accessing the topLeft and bottomRight.
>
> I am doing it as follows:
>
>
>
> /////////////////////////////////////////////////////////////////////////////////////////////////////////////////
>
>   void H3DNodeListWidget::highlightRegExpChanged()
>
> {
>
>     QRegExp regExp(m_nodeHighlightingEditor->text(),Qt::CaseInsensitive,QRegExp::FixedString);
>
>      m_highlightModel->setFilterRegExp(regExp);
>
>      const QModelIndex topLeft = m_highlightModel->index(0,0,QModelIndex());
>
>     const QModelIndex bottomRight = m_highlightModel->index(0,m_highlightModel->columnCount()-1,QModelIndex());
>
>
>     emit proxyModelHighlightChanged(topLeft,bottomRight);
>
>
> }
>
>
>
>
> //////////////////////////////////////////////////////////////////////////////////////////////////////////////////
>
>
> And in the constructor of the same class i am connecting one signal to
> another signal as follows:
>
>       connect(this,SIGNAL(proxyModelHighlightChanged(QModelIndex,QModelIndex)),m_highlightModel,SIGNAL(dataChanged(QModelIndex,QModelIndex)));
>
>
>
> I think i am doing something wrong in accessing the topLeft and bottomRight model index.
>
>
>
> Any further hint on it?
>
>
>
> Regards
>
> Sajjad
>
>
> On Tue, Jan 4, 2011 at 8:56 PM, Scott Aron Bloom <
> Scott.Bloom at onshorecs.com> wrote:
>
>> Yes…
>>
>>
>>
>> *From:* qt-interest-bounces+scott.bloom=onshorecs.com at qt.nokia.com[mailto:
>> qt-interest-bounces+scott.bloom <qt-interest-bounces%2Bscott.bloom>=
>> onshorecs.com at qt.nokia.com] *On Behalf Of *Sajjad
>> *Sent:* Tuesday, January 04, 2011 11:50 AM
>> *To:* qt-interest at trolltech.com
>> *Subject:* Re: [Qt-interest] Tree Item view Highlighter
>>
>>
>>
>> Hello Andre,
>>
>>
>>
>> I think inside the slot i shall have to emit the dataChanged() as follows:
>>
>>
>>
>> ///////////////////////////////////////////////////////////////////
>>
>>
>>
>> void H3DNodeListWidget::highlightRegExpChanged()
>>
>> {
>>
>>     QRegExp regExp(m_nodeHighlightingEditor->text(),Qt::CaseInsensitive,QRegExp::FixedString);
>>
>>     m_highlightModel->setFilterRegExp(regExp);
>>
>>
>>
>>
>>
>>     //in that case i have to send the QModleIndex parameters
>>
>>
>>
>>     //to specify the range and how do i retrieve this
>>
>>     emit m_highlightModel->dataChanged(m_modelIndexStart,m_modelIndexEnd);
>>
>> }
>>
>>
>>
>>
>>
>> ///////////////////////////////////////////////////////////////////
>>
>>
>>
>>
>>
>> Am i in the right track?
>>
>>
>>
>>
>>
>>
>>
>> Regards
>>
>> Sajjad
>>
>> On Tue, Jan 4, 2011 at 8:34 PM, André Somers <andre at familiesomers.nl>
>> wrote:
>>
>>
>>
>> Verstuurd vanaf mijn iPhone
>>
>>
>> Op 4 jan. 2011 om 19:51 heeft Sajjad <dosto.walla at gmail.com> het volgende
>> geschreven:
>>
>> Hello
>>
>>
>>
>> emitting the dataChanged() is done only when we re-implement the setData()
>> function. Should i over-ride data() or the setData() function?
>>
>> No, emitting dataChanged is done when data in the model changes. That
>> happens often when setData is called, but that is not the only thing that
>> can trigger it. In this case, changing your regexp changes the data. So, you
>> override data() as explained earlier, and you emit dataChanged when the
>> regexp changes.
>>
>>
>>
>> André
>>
>>
>>
>>
>>
>>
>>
>>
>>
>> Regards
>>
>> Sajjad
>>
>> On Tue, Jan 4, 2011 at 6:53 PM, Scott Aron Bloom <
>> Scott.Bloom at onshorecs.com> wrote:
>>
>> On Tue, Jan 4, 2011 at 10:21 AM, Andre Somers <andre at familiesomers.nl>
>> wrote:
>>
>> Op Di, 4 januari, 2011 9:21 am, schreef Sajjad:
>>
>>
>> >>  Is there anything missing up there? I removed the other function that
>> i
>> >> over-rid mentioned in the previous post.
>> >>
>> >>  I am still not getting any effect. The textchanged() signal is
>> >> connected
>> >> to  the slot as before.
>> >>
>> >> Ah, of course... Sorry about that.
>> >>
>> >> First of all: are you getting an effect if you set a fixed regexp to
>> >> begin
>> >> with? If not, then something is wrong in the code above. Set a
>> >> breakpoint
>> >> where you return the color and see if you ever arrive there at all...
>> >>
>> >
>> > I set the breakpoint at the slot
>> >
>> >   void H3DNodeListWidget::highlightRegExpChanged()
>> >
>> > {
>> >
>> >     QRegExp
>> >
>> regExp(m_nodeHighlightingEditor->text(),Qt::CaseInsensitive,QRegExp::FixedString);
>> >
>> >      m_highlightModel->setFilterRegExp(regExp);
>> >
>> > }
>> >
>>
>> I meant setting the breakpoint in the data() function.
>>
>>
>>
>> The breakpoint  has been set there as well.
>>
>>
>> > And i did not reach  the data() function while stepping into the code.
>>
>> I can imagine it did not.
>>
>>
>> >> However, I think the problem is, that you need to notify your view that
>> >> the
>> >> data has changed if your regexp changes. For testing, just emit
>> reset(),
>> >> but
>> >> in your real implementation, you should probably be a bit nicer and
>> emit
>> >> dataChanged() with the right modelindexes.
>> >>
>>
>> i believ ethat the dataChanged() signal two model indexes as input
>> parameter. I need to highlight only one tree item that maches the expression
>> in the line edit. In that case how should i set the value for the signal
>> that takes 2 input parameters. Should it be the same source index specified
>> twice? I tried something as follows:
>>
>>
>>
>>
>> //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
>>
>>
>>
>> QVariant H3DHighlighterProxyModel::data(const QModelIndex &index, int role) const
>>
>> {
>>
>>     //get  the handle to  the underlyiing data
>>
>>     QModelIndex  sourceIndex = mapToSource(index);
>>
>>     if(!sourceIndex.isValid())
>>
>>     {
>>
>>         return QVariant();
>>
>>     }
>>
>>     if(role == Qt::BackgroundRole)
>>
>>     {
>>
>>         if(sourceModel()->data(sourceIndex).toString().contains(filterRegExp()))
>>
>>         {
>>
>>
>>
>>             //the following statement gives error because the virtual function itself
>>
>>
>>
>>             //declared const
>>
>>             emit dataChanged(sourceIndex,sourceIndex);
>>
>>             return Qt::cyan;
>>
>>         }
>>
>>         else
>>
>>         {
>>
>>             //return the default background color
>>
>>             //whatever may it be
>>
>>             return QVariant();
>>
>>         }
>>
>>     }
>>
>>     else
>>
>>     {
>>
>>         return sourceIndex.data(role);
>>
>>     }
>>
>> }
>>
>>
>>
>>
>> ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
>>
>>
>>
>>
>>
>> And then if i have to set the connection as follows, i believe that it
>> will not be valid:
>>
>>
>>
>>
>> connect(m_proxyMode,dataChanged(QModelIndex,QModelIndex),m_treeView,SLOT(update(QModelIndex))));
>>
>>
>>
>> As you can see that the parameters are not matching.
>>
>>
>>
>> From all  the discussions you can imagine that i am having trouble to
>> grasp the basic idea of model.view programming.
>>
>> Could you provide some references where these issues are well discussed?
>>
>>
>>
>>
>>
>> Regards
>>
>> Sajjad
>>
>> -----------------------
>>
>>
>>
>>
>>
>> Yes, read the Qt documentation on model view programming…  and the
>> signal/slot programming…
>>
>>
>>
>> The dataChanged signal, allows you to send out a “square” of topLeft to
>> bottomRight inclusive…  If topLeft == bottomRight, then only that cell is
>> updated.
>>
>>
>>
>> As to your update connection, you shouldn’t have to, all views are
>> automatically connected to the dataChanged signal
>>
>>
>>
>> Scott
>>
>>
>>
>> _______________________________________________
>> Qt-interest mailing list
>> Qt-interest at qt.nokia.com
>> http://lists.qt.nokia.com/mailman/listinfo/qt-interest
>>
>>
>>
>> _______________________________________________
>> Qt-interest mailing list
>> Qt-interest at qt.nokia.com
>> http://lists.qt.nokia.com/mailman/listinfo/qt-interest
>>
>>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://lists.qt-project.org/pipermail/qt-interest-old/attachments/20110111/d4b65a52/attachment.html 


More information about the Qt-interest-old mailing list