1 Database + 2 Models + 2 Views



  • Hi all

    How do I get two QSqlTableModels, both using the same database, to update based on the other? I may be doing this wrong, but I am using a QDataWidgetMapper to drive a set of widgets on one dialog. So that means I need a model that is always looking at the same table in the database.

    I have another view that I want to be able to change tables, so that requires a different model, as far as I know. I am using the same database connection for both models...perhaps this is wrong.

    I presume that I can't use the same model to display a different table in two different views.

    When the mapped ui items update their model, I would like the values to be updated in the second model (if it has the same table selected, obviously). And vice-versa. However this doesn't happen.
    How do I accomplish this?

    I have tried reselecting both the models but this doesn't seem to help.

    Many thanks for your help!

    Edit:
    Both the models are set to use QSqlTableModel::OnFieldChange as their editStrategy
    The mapper is set to DataWidgetMapper::AutoSubmit
    Interestingly when the non-mapped tableview is edited, the results are seen in the mapped widgets, but only if I use the previous and next buttons I've set up to call toNext and toPrevious. I.e if I'm at the first record, I hit next, but it takes me to the new first record rather than the second.
    Edit Two:
    I've created two slots for the dataChanged signal of each model, and neither gets hit..?



  • [quote]
    When the mapped ui items update their model, I would like the values to be updated in the second model (if it has the same table selected, obviously). And vice-versa. However this doesn’t happen.
    How do I accomplish this?
    [/quote]

    Unfortunately, there's no standard way a SQL model can know when the underlying table was modified (by another model, or in general by some external modification). You have to write a workaround.

    For example:

    • If your DB supports notifications, you can use QSqlDriver::subscribeToNotification and call "NOTIFY" in a trigger, which will cause the QSqlDriver::notification signal emission; in a slot, you can simply ask the model to select() again.
    • If your DB doesn't, you can for instance make some trigger to add a row in a table, and from your Qt code you poll that table.


  • OK. Thanks for the those. Notify sounds like a way forwards.
    I've been trying a few other options, following is the simplest:

    If I am using the mapper I now set the other view to use the same model. So now there's one model, two views. Simples, right?
    One view is a tableview, the other a set of widgets using a mapper.

    Still, things are not as I expect. I followed the books example, and connected the tableview rowchanged signal to the mappers setcurrentmodelindex. This changes the selection in the mapper if I select a row in the tableview.

    If I alter anything in the tableview, it is reflected in the mapper widgets, when I click in a different cell (not when I hit enter)
    But if I change anything in the mapper widgets, only the first change is reflected in the tableview. Ideas?

    Edit: working now. I changed to QSqlRelationalTableModel from QSqlTableModel and all seems fine.


Log in to reply
 

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