How to access QSqlRelationalModel from function?



  • This is my header:

    class RepairDevices: public QMainWindow
    {
        Q_OBJECT
    public:
        RepairDevices();    
    
    
    private slots:
    	void refresh_devices_search_tbl();
    	
    private:
        void setupDevices();
        void setupRepairs();       
        Ui::RepairDevices ui;
        
        QSqlRelationalTableModel *repairsmodel;
    

    This is my Source file:

    RepairDevices::RepairDevices()
    {
    	repairsmodel = new QSqlRelationalTableModel(this);
    }
    	
    void refresh_devices_search_tbl(){
    	Ui::RepairDevices *ui;
    	QString sn = ui->sn_search_txt->toPlainText();
    	
    	repairsmodel->setFilter("id>76");
    }
    

    But It's ending with Error application ended unexpectedly.
    Obviously, I 'm doing something very won here.
    Which is the correct way to do it?
    So I 'll be able to make repairsmodel->setFilter work in my function?


  • Qt Champions 2017

    Hi

    void refresh_devices_search_tbl(){
    Ui::RepairDevices *ui; <<<< what is this ? looks nasty, Did you even allocate it ? Looks bad and wrong to me :)
    }

    why is refresh_devices_search_tbl not member of RepairDevices ?

    If it was then repairsmodel is available to it.

    RepairDevices::refresh_devices_search_tbl



  • The 'Ui::RepairDevices *ui' I put it for someone to norice it and tell me if it's correct.
    I made the function a private member, so now I have access to ui and repairsmodel.
    But when the execution goes to repairsmodel->setFilter("id>76") (this is in the function), the application breaks down.
    "The program has unexpectedly finished."

    I tried in debugging, when code execution goes to repairsmodel->setFilter("id>76"), I get this error:
    alt text


  • Qt Champions 2017

    @Panoss

    im not sure what you are doing but just make
    refresh_devices_search_tbl a function in
    RepairDevices

    and you dont need anything else.

    RepairDevices::RepairDevices()
    {
    repairsmodel = new QSqlRelationalTableModel(this); // make it
    }

    void RepairDevices::refresh_devices_search_tbl(){
    Ui::RepairDevices *ui; // DONT DO THIS. its evil :)

    repairsmodel->setFilter("id>76"); // use it
    

    }



  • This error appeared after I did exactly what you 're suggesting.


  • Qt Champions 2017

    @Panoss
    if u still have Ui::RepairDevices *ui
    then no wonder :)

    Ui::RepairDevices *ui;
    QString sn = ui->sn_search_txt->toPlainText(); ///// BIG FAT CRASH HERE



  • I don't have it, I 've deleted it.


  • Qt Champions 2017

    ok,
    then debug it. find where you crash.

    This also looks a bit odd to me

    RepairDevices::RepairDevices()
    {
    repairsmodel = new QSqlRelationalTableModel(this);
    }

    its that the constructor ?
    What about the stuff for QMainWindow ?



  • I told you.I posted the image of the error above.
    Isn't it visible?


  • Qt Champions 2017

    @Panoss
    Yes but it jsut says. Programs crashed.
    So find your error using the debugger :)

    If i should guess

    i think
    RepairDevices::RepairDevices()
    {
    repairsmodel = new QSqlRelationalTableModel(this);
    }

    is never called and you crash at this line
    repairsmodel->setFilter("id>76"); // use it
    since repairsmodel is just a dangling pointer.



  • mrjj forgive my ignorance, I'm a total newbee.
    I suppose this is the error:
    ...repairdevices.cpp:115: error: Exception at 0x4029fb, code: 0xc0000005: read access violation at: 0x0, flags=0x0 (first chance)


  • Qt Champions 2017

    @Panoss
    Ok fair enough.

    The errors says that something in the program was fiddling around with some memeory it should not.

    so try this and tell me if crash goes away

    
    RepairDevices::RepairDevices()
    {
     //////   OUT	repairsmodel = new QSqlRelationalTableModel(this);
    }
    	
    void refresh_devices_search_tbl(){
     // make it here jsut to test
    	repairsmodel = new QSqlRelationalTableModel(this); 
    
    	QString sn = ui->sn_search_txt->toPlainText();
    	
    	repairsmodel->setFilter("id>76");
    
        qDebug() << "in refresh_devices_search_tbl";
    }
    

    also please use
    qDebug()
    like in sample. it helps alot to see what is called.



  • @mrjj said in How to access QSqlRelationalModel from function?:

    @Panoss
    RepairDevices::RepairDevices()
    {
    repairsmodel = new QSqlRelationalTableModel(this);
    }

    is never called and you crash at this line

    I think you 're right, somehow refresh_devices_search_tbl() is called before repairsmodel = new QSqlRelationalTableModel(this);!!!
    I don't understand how is this possible...


  • Qt Champions 2017

    @Panoss said in How to access QSqlRelationalModel from function?:

    RepairDevices::RepairDevices()
    {
    repairsmodel = new QSqlRelationalTableModel(this);
    }

    This looks like the constructor but most likely you are using the one you get from
    QMainWindow that takes a parent.
    and hence yours is never called.

    show how you create the RepairDevices instance ?

    ( i mean where you do like )
    RepairDevices *mine= new RepairDevices ( ? )



  • In main.cpp, this has this code:

    #include "repairdevices.h"
    #include <QtWidgets>
    
    
    
    int main(int argc, char * argv[])
    {
        Q_INIT_RESOURCE(books);
    
        QApplication app(argc, argv);    
    
        RepairDevices win;
        win.show();
    
        return app.exec();
    }
    

  • Qt Champions 2017

    @Panoss said in How to access QSqlRelationalModel from function?:

    Hmm i would have expected it to call
    your constructor but it seems not. Mainwindow must have one that qualify.

    Well it seems to use the one u get from your
    base class and hence yours is never called.

    so that is why.

    Using a debugger this would be really clear :)

    a normal mainwindow constructor looks like this

    explicit MainWindow(QWidget *parent = 0);
    
    MainWindow::MainWindow(QWidget *parent) :
        QMainWindow(parent),
        ui(new Ui::MainWindow)
    {
    }
    


  • @mrjj said in How to access QSqlRelationalModel from function?:

    @Panoss said in How to access QSqlRelationalModel from function?:

    Hmm i would have expected it to call
    your constructor but it seems not.
    I thought 'RepairDevices win' calls the constructor.

    @mrjj said in How to access QSqlRelationalModel from function?:

    @Panoss said in How to access QSqlRelationalModel from function?:
    Using a debugger this would be really clear :)
    I did use the debugger but it was not clear at all to me :).

    It still isn't, what must I do?
    I ''l do mainwindow constructor as you suggested and post the result.

    I did the test you suggested me above, I had to change a dot to -> (ui->sn_search_txt to ui.sn_search_txt)

            repairsmodel = new QSqlRelationalTableModel(this);
            QString sn = ui.sn_search_txt->toPlainText();
            repairsmodel ->setFilter("id>76");
            qDebug() << "in refresh_devices_search_tbl";
    

    and got no error.
    The etext is not printed, so the refresh_devices_search_tbl is not called now.


  • Qt Champions 2017

    @Panoss said in How to access QSqlRelationalModel from function?:

    refresh_devices_search_tbl

    who calls it ?
    Is it a slot for a button or how should it be called?



  • It 'a a slot for two combo boxes and two textboxes.
    It 's called on textChanged and currentIndexChanged.
    (omg text and index of combos I think do get changed during form's load, e.g when they are mapped to the data mapper.)


  • Qt Champions 2017

    @Panoss
    well just check the
    connects and its should be clear why its not called.
    (connect return true / false)

    At some point you will also need to learn to use the debugger and set break points.
    Its THE BEST tool to find out what is happening and where program goes. :)



  • I found the guilty!!With the debugger.
    It's a combo box which calls the function at oncurrentIndexChanged event!
    This means that when a combo gets data from a model, the oncurrentIndexChanged event is called!!
    How can I fix this?


  • Qt Champions 2017

    @Panoss
    I think its by design.
    When it get data, the current
    index is changed so its correct to
    emit the signal.
    Check current index before and after and see.

    Most likely its 100% correct and you might need to use other signal or
    wait until after the data load to set the connect.

    ps. Good work with debugger :)



  • Can I do something like this?

    ui.type_search_cbo->cancelEventoncurrentIndexChanged;
    ui.type_search_cbo->setModel(model);
    ui.type_search_cbo->resetEventoncurrentIndexChanged;
    

    (nice code, eh?)


  • Qt Champions 2017

    @Panoss

    well i would prefer if you could just wait to connect the slots
    so its ok it says index changed.

    There is
    http://doc.qt.io/qt-5/qobject.html#blockSignals

    but again, you are fixing a symptom so it not the best.



  • Yes, it works with block signals.
    So, this is not the correct remedy?

    How could I wait to connect the slots?
    I don't want just to fix the symptom, I want to do it properly.


  • Qt Champions 2017

    @Panoss
    well where do you hook up the oncurrentIndexChanged signal?



  • It's a slot for a combo:

    void RepairDevices::on_type_search_cbo_currentIndexChanged(int index)
    {
        refresh_devices_search_tbl(); 
    }
    

  • Qt Champions 2017

    @Panoss said in How to access QSqlRelationalModel from function?:

    Ah you are using the auto connect feature?
    you do not have connect( xxxx) , correct ?



  • No, I don't even know what autoconnect is.
    I have no connect( xxxx) for this function.
    (unless you 're meaning that this way, it 's autoconnected)


  • Qt Champions 2017

    @Panoss

    well it means it will hook it up if names matches.
    QMetaObject::connectSlotsByName(MainWindow);
    ( in setupUI)

    just use blockSignals then. :)



  • Thank you very much mrjj, you helped me A LOT!


  • Qt Champions 2017

    @Panoss
    Np.
    Thats why i lurk around here :)


Log in to reply
 

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