this is weird...



  • hi.
    something weird is going on.
    i have a couple of lines that assign colors to an array. someting like this:

    myColor[0] = new QColor( 0, 0, 0);

    the weird thing is that when i comment those lines out, the program quits normally when i click the close button of the window. but when i DON'T comment those lines out, when i click that close button, i get the following error, in red:

    The program has unexpectedly finished.

    and the qt creator informs me that the program crashed. i dont understand whats going on here. am i doing somethiong wrong?


  • Qt Champions 2016

    well what do you with myColor ?
    just inserting pointers to QColor in a list should not crash anything.

    how did you define myColor ?

    QColor *myColor[100];

    is it global data ?

    if you defined it in a function, then it will run out of scope and be invalid later.



  • @mrjj said:

    well what do you with myColor ?
    just inserting pointers to QColor in a list should not crash anything.

    right now i don't do anything with it. the plan is to provide a set of colors for all UI elements to use, accessible via a function.

    how did you define myColor ?
    QColor *myColor[100];

    i use QColor *myColor[];
    should there be a number between [ and ] ?

    is it global data ?

    the QColor *myColor[]; line is in the header file, just after the Q_OBJECT line. that should make it available to all the functions of the class, right?

    if you defined it in a function, then it will run out of scope and be invalid later.

    the assignments are in a function, but the definition is in the header file



  • a tip for debuging this: run in debug mode, with the debugger turned on, see where the crash happens, and fugure it out.
    looks like something is trying to delete it layer, maybe twice.
    for a design tip, try as much as you can not to use new and delete, unless you must need it. Qt has its QObect way to make sure you don't forget to delete things. QColor is just an integer, so there is no need to make it dynamic memory.


  • Lifetime Qt Champion

    Hi,

    You are declaring a pointer to an array of QColor objects, did you allocated before using it ? If you need a list/vector of QColor why not use QVector<QColor> or std::vector<QColor> ?

    @yoavmil QColor is not just an integer, it's a full class of its own. Using QObject when needed doesn't free you from proper memory management handling.


  • Qt Champions 2016

    @harry
    --should there be a number between [ and ] ?
    yes if you mean it to be a list. else/now
    it means a pointer to a list.
    as @SGaist mentions, it might be easier to use a dynamic list instead of old type of c array
    so std::vector<QColor *> MyColor;
    and MyColor.push_back( new QColor( 0, 0, 0) );
    Note that the vector wont delete the the QColors object.

    --that should make it available to all the functions of the class, right?
    Yes, it is a so called member variable and is the correct way to have data.

    --the plan is to provide a set of colors for all UI elements to use
    Can I ask why stylesheets wont work for you ?
    http://doc.qt.io/qt-5.5/stylesheet-examples.html
    You can easy say for all Buttons, use this color.
    If you apply it to mainwindow, it applies to all objects on screen.


  • Lifetime Qt Champion

    To add to @mrjj, allocating QColor on the heap is rather unusual, if you take a look at Qt's classes which are using QColor, you'll see they all take const references. So you'll be dereferencing your heap allocated objects all the time if you use them with Qt classes which essentially wastes CPU cycles.



  • i finally had some time to return to this project, and now i have 2 more problems:

    as i said above, i have an array of QColors. the problem is that when i try to access one of them with

    return mycolor[n];

    the compiler gives me the following error:

    invalid conversion from QColor* to Qrgb.

    wait, what? where does this Qrgb come from? the array contains Qcolors, and the function (or method?) is supposed to return a QColor. so what am i doing wrong here?

    the other problem is that the paintEvent() function of that class is not called. i change the size (both by dragging the edge of the window and by calling resize()), i call update() but paintEvent does not run, the background does not turn green, and the breakpoint is not hit. what's going on here? it is a subclass of QWidget, in case that matters.


  • Lifetime Qt Champion

    You don't have an array of QColor, you have an array of QColor pointers. Since your function returns a QColor object, a conversion must be done and the constructor that matches best is the one taking a Qrgb, but still, it's not valid.

    As suggested before, use a vector of QColor rather than a vector of pointers to QColor.

    As for paintEvent, can you post your code ?



  • @SGaist said:

    You don't have an array of QColor, you have an array of QColor pointers. Since your function returns a QColor object, a conversion must be done and the constructor that matches best is the one taking a Qrgb, but still, it's not valid.

    As suggested before, use a vector of QColor rather than a vector of pointers to QColor.

    i put in a QVector, nd now it seems to work ok. i'm gonna find out when i get to the point where i get the button to request a color from the screen.

    As for paintEvent, can you post your code ?

    what code are you referring to? the code in my paintEvent() method is irrelevant right now because it does not get called. yes, i have confirmed that by setting a breakpoint on the first line.

    my main() method looks like this:

    int main(int argc, char *argv[])
    {
    QApplication a(argc, argv);
    MyScreen w;
    w.show();
    return a.exec();
    }

    did i mention that the paintEvent() problem is with MyScreen?

    in myscreen.h i had these lines:

    public slots:
    void paintEvent();

    and then i saw these lines in an example program:

    protected:
    void paintEvent();

    and i tried them out but that change made no difference.



  • @harry You should read, learn, and remember this: http://www.cplusplus.com/doc/tutorial/arrays/


  • Lifetime Qt Champion

    Your paintEvent signature is wrong, it's missing the parameter.



  • @harry said:

    @SGaist said:

    You don't have an array of QColor, you have an array of QColor pointers. Since your function returns a QColor object, a conversion must be done and the constructor that matches best is the one taking a Qrgb, but still, it's not valid.

    As suggested before, use a vector of QColor rather than a vector of pointers to QColor.

    i put in a QVector, nd now it seems to work ok. i'm gonna find out when i get to the point where i get the button to request a color from the screen.

    ok, i'm trying to access that array now, and when i say something like

    Qcolor c = MyColor[index];

    i get a little window with an error message about a segmentation fault.

    this line is in the header:

    QVector<QColor> MyColor;

    what am i doing wrong?


  • Qt Champions 2016

    Hi
    QVector<QColor> MyColor;
    means, dynamic list of colors. (it just defines it)
    But unless do you
    MyColor.append( QColor(255,0,0) );

    Then
    Qcolor c = MyColor[index];
    will crash your program as the list is empty.



  • @mrjj said:

    Hi
    QVector<QColor> MyColor;
    means, dynamic list of colors. (it just defines it)
    But unless do you
    MyColor.append( QColor(255,0,0) );

    i guess i should have mentioned that i have a couple of lines like this:

    MyColor[3] = QColor( 0, 255, 255);

    in my initcolors method. and i have confirmed that this method gets called when i launch the app, and it assigns the colors as intended.

    should i try the append thing instead? but then how can i be sure which color ends up at which index?


  • Qt Champions 2016

    hi
    if u have
    MyColor[3] = QColor( 0, 255, 255);
    then list is not empty
    maybe index just too high for what u got in list.
    use the .size() to check if index is ok



  • @mrjj said:

    hi
    if u have
    MyColor[3] = QColor( 0, 255, 255);
    then list is not empty
    maybe index just too high for what u got in list.
    use the .size() to check if index is ok

    just checked: size is 10 as it should be
    index is 1, well within limits.


  • Qt Champions 2016

    but did u do
    MyColor[0] = QColor( 0, 255, 255);
    MyColor[1] = QColor( 0, 255, 255);
    MyColor[2] = QColor( 0, 255, 255);
    MyColor[3] = QColor( 0, 255, 255);
    MyColor[4] = QColor( 0, 255, 255);
    etc
    does it have one at 1 ?

    update:
    if I do
    QVector<QColor> colors;
    colors[0]= QColor(244,0,0); <<< crash here.
    qDebug() << colors.size();

    So not sure why it seems to work for you.
    But if u have size() 10 then it must have.
    I would use append.
    just append in the order you want.



  • @mrjj said:

    but did u do
    MyColor[0] = QColor( 0, 255, 255);
    MyColor[1] = QColor( 0, 255, 255);
    MyColor[2] = QColor( 0, 255, 255);
    MyColor[3] = QColor( 0, 255, 255);
    MyColor[4] = QColor( 0, 255, 255);
    etc
    does it have one at 1 ?

    yes, i fill the array with 10 different colors.

    update:
    if I do
    QVector<QColor> colors;
    colors[0]= QColor(244,0,0); <<< crash here.
    qDebug() << colors.size();

    So not sure why it seems to work for you.
    But if u have size() 10 then it must have.
    I would use append.
    just append in the order you want.

    i tried append. it seems to work, but i still have the same problem: when i try to get a qcolor from the qvector like this:

    return myColor.at(1);

    i get that little window with the segmentation fault. SIGSEGV, if that makes a difference.

    i just thought of something. gotta try it out...



  • @harry said:

    i just thought of something. gotta try it out...

    i have all my mycolor.append() lines in initColors(), and there they work nomally. but when i copy one of them into getColor(), i get a segmentation fault. i guess that means initColors() can access the QVector but getColor() can not. question is, why? both methods (or functions or whatever) are part of the same class, so what's going on here? weird.


  • Qt Champions 2016

    Ok it does sound strange.
    so
    QVector<QColor> myColors;
    is defined in class .h ?
    And only there. ?

    So when ever you use myColor, its the same one, the one and only?
    can u show all the code of the place where u use
    return myColor.at(1);

    is it just a access function like
    QColor GetColor(index ) {
    return myColor.at(index);
    }

    This should work with no issues so something strange is going on :)

    so what ever u are doing with myColors we need to know



  • @mrjj said:

    Ok it does sound strange.
    so
    QVector<QColor> myColors;
    is defined in class .h ?

    check. that should make it available to all methods of that class, right?

    And only there. ?

    check

    So when ever you use myColor, its the same one, the one and only?

    it should be. how can i find out?

    can u show all the code of the place where u use
    return myColor.at(1);

    i'm running OSX right now which is why i can't access my code. i'll post some code when i boot into ubuntu again.

    is it just a access function like
    QColor GetColor(index ) {
    return myColor.at(index);
    }

    check. actually i make sure the index is within acceptable limits first. but yeah, that function is there to return one of those 10 colors to any UI element that requests one.

    This should work with no issues so something strange is going on :)

    so what ever u are doing with myColors we need to know


  • Qt Champions 2016

    Ok
    Yes if defined in class
    it is available to all methods of that class.
    Its defined in the class, yes ?
    Not outside, like global variable ?

    It sounds it should just work. So must be something
    unexpected .
    Looking forward to code.


  • Lifetime Qt Champion

    An additional check: do you have something like QVector<QColor> myColors; in your constructor ?



  • @SGaist said:

    An additional check: do you have something like QVector<QColor> myColor; in your constructor ?

    nope, that line is in the header file. would i be right in assuming that if that line was in the constructor, no other method would have access to the qvector? IOW, wouldn't the append lines in initcolors() also give me segmentation faults? the qvector is declared in the header file and initialized to 10 elements in the constructor (see below).

    ok, so much for the header file. now the implementation file:

    in the constructor i have this line:
    myColor = QVector<QColor>(10);

    in my initcolors() method i have 10 lines like
    myColor.append(QColor(0,0,0));
    and
    qDebug() << myColor.at(1);
    and they work normally.

    my getcolors() method (just after initcolors(), in the same class) ends with this line:
    return myColor.at(index);
    and that's the one that gives me the segmentation fault.


  • Qt Champions 2016

    So you have something like

    class MainWindow : public QMainWindow {
      Q_OBJECT
    
     public:
      explicit MainWindow(QWidget* parent = 0);
      ~MainWindow();
     public:
      void initcolors() {
        myColor = QVector<QColor>(10);
        myColor[0] = (QColor(0, 0, 0));
        myColor[1] = (QColor(244, 0, 0));
        myColor[2] = (QColor(255, 0, 0));
      }
    
      QColor GetColor(int index) {
        return myColor.at(index);
      }
      void Test() {
        qDebug() << GetColor(2);
      }
     private slots:
      void on_pushButton_released();
    
     private:
      Ui::MainWindow* ui;
      QVector<QColor> myColor;
    
    };
    

    And you call initcolors from constructor.

    If I call Test, it works as expected.

    So can you show how you call your
    getcolors ?
    Should be something like class->getcolors() if outside the class



  • And you call initcolors from constructor.

    correct. in the myScreen constructor i initialize the QVector with myColor = QVector<QColor>(10); then in the very next line i call initColors(); that runs ok, but when the button requests a color, i get that segmentation fault :-(

    If I call Test, it works as expected.

    So can you show how you call your
    getcolors ?
    Should be something like class->getcolors() if outside the class

    that part is in the button.cpp file. first i make sure index is an int and in the proper range, then

    qDebug() << "index: " << index; // shows "index: 1"
    buttonColor = screen->getColor(index);
    qDebug() << buttonColor;

    i noticed that initColors() was in the private: section while getColor() was in the public: section. so i moved initColors() to the public: section but that didn't help :-(

    i simply don't understand why initColors() has access to the QVector but getColor() does not.


  • Qt Champions 2016

    @harry said:
    no it seems odd.
    in button.cpp
    how do you get the screen pointer?
    Can you show how u declare it?
    and the code where you new it. or get reference to it.



  • i finally found out what was wrong: the screen pointer wasn't set. but that throws up another question: why did the button manage to call getColor()? with the pointer set to some random value, the app should have crashed...

    but now i have another problem. i added another class to my project, with a QVector<myButton>

    in the header i have this:

    QVector<myButton> buttons;

    and in the constructor of the new class

    buttons = QVector<myButton>();

    that last line is the problem. if i comment it out, it compiles ok, but when i leave it in, i get a whole bunch of error messages, none of which tell me much. my current theory is that something is wrong with the myButton class, but i have no idea what.


  • Moderators

    @harry This line is not needed because buttons is a member variable and its default constructor will be called automatically:

    buttons = QVector<myButton>();
    

    What errors do you get?


  • Lifetime Qt Champion

    Based on the class name, wouldn't myButton be a derived class of QPushButton ? If so you can't use it like that, QObject derived class can't be copied. More information here


Log in to reply
 

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