10/10/2014

Solution for fillData->clip->clipRect.isEmpty() in Qt

After long time I'm going to write another blog post.  This is regarding the Qt and it will detail a solution for the problem of fillData->clip->clipRect.isEmpty(). I got this problem as below cage while trying to create a 'title block' for the engineering drawing. 

Sample title block (copy rights)
I created a QPrintPreviewDialog which previews engineering drawings generated by the application. I draw rectangle to represent title block which consists details of the drawing. At some points length of the detail higher than the space of the rectangle. Then I got below run-time error.


ASSERT: "!fillData->clip->clipRect.isEmpty()" in file painting/qpaintengine_raster.cpp, line 4435

The simple answer is you are going to write the text in the rectangle which is not have enough space to show your content.

You can do following things.
1. Increase the size of Rectangle.
2. Decrease the font size.
3. Or use Qt.TextElideMode

enum Qt::TextElideMode

This enum specifies where the ellipsis should appear when displaying texts that don't fit:

ConstantValueDescription
Qt::ElideLeft0The ellipsis should appear at the beginning of the text.
Qt::ElideRight1The ellipsis should appear at the end of the text.
Qt::ElideMiddle2The ellipsis should appear in the middle of the text.
Qt::ElideNone3Ellipsis should NOT appear in the text.




5/06/2014

ASSERT: "uint(i) < uint(size())" in file bla.. bla.., line bla.. in Qt

Hope you know these days I'm trying Qt\C++. Today I spent lot of my valuable time for solve the error mentioned in the title (ASSERT: "uint(i) < uint(size())" in file bla.. bla.., line bla..). It is run time error and I tried lot to find what was happening. At that time I have no knowledge about the 'Q_ASSERT' also.

A one bug hidden inside below code. Can you find it?


for (int row = 0; row < heights().count(); ++row)
        {
            for (int col = 0; col < ampererates().count(); ++col)
            {
                QModelIndex index = item_model->index(row,col,QModelIndex());
                no_of_components = item_model->data(index).toString();

                if(no_of_components.toInt()>0)
                {
                    height = heights().at(row);
                    ampererates = ampererates.at(col);
                    item_details.clear();
                    item_details.append(QString::number(selected_width));
                    item_details.append(height);
                    item_details.append(amperate);
                    item_details.append(no_of_components);

                    selected_components.append(item_details);
                }
            }
        }

I know it is very difficult to found a bug without the whole story. But I'm writing this post to anyone who got the same problem as a beginner like me and detail about my thinking pattern.

As a first step I put qDebug() s intermediate of the lines. And I found the bug in below line.
ampererates = ampererates.at(col); 

Then I thought what type of error it was. It mentioned something about sizes. Sizes?? something about arrays or List..?? Then I thought if there is no error in count() of the same list. Why it was informing error like out of bound?
for (int col = 0; col < ampererates().count(); ++col) Working fine.
ampererates = ampererates.at(col); ++col) Not working

Variable ampererates is QString. And ampererates() is QStringList. Ohh.. Shit.. I missed the brackets. Solution founded. I was trying to read a char from QString instead of read string from QStringList. There is no guarantee that index position is valid.

Then I checked what .at() doing in different classes. As mentioned in there class references.

const QChar QString::at ( int position ) const

Returns the character at the given index position in the string.
The position must be a valid index position in the string (i.e., 0 <= position < size()).

const T & QList::at ( int i ) const

Returns the item at index position i in the list. i must be a valid index position in the list (i.e., 0 <= i < size()).
This function is very fast (constant time).

QStringList inhereted from QList.

OK. Thinks this is help somebody to solve same issue. I'm going to learn further what 'Q_ASSERT' do.

Thanks for reading. Have a nice day.

11/20/2013

d-pointer in Qt


My dear friends, How are you? Nice to see you after such a long time.  Nowadays I'm slightly moving to the Qt and hope to publish posts about it.   So let's move to the post.  Actually This is warm-up post ;)

D-pointer or opaque pointer  technique can be called as a design pattern.  According to the Wikipedia this technique same as Bridge pattern and sometimes  referred to as handle classes, the Pimpl idiom, Compiler firewall idiom or Cheshire Cat.

With d-pointer programmers gain some advantages.

1. Can be created simple interfaces.
2. Hide the implementation details of an interface from ordinary clients.
3. Provide binary code compatibility with different versions of a shared library.

You can implement d-pointer as this.

     

// MyClass.h

class MyClass
{
public:
    MyClass();
    ~MyClass();
    // implementation methods
private:
    class MyClassPrivate *d;
};

// MyClass.cpp
class MyClassPrivate
{
    int x;
};

MyClass::MyClass()
: d(*new MyClassPrivate)
{
}

MyClass::~MyClass()
{
    delete d;
}  
 

References

 http://qt-project.org/wiki/Dpointer