While trying to debug the problem recently reported on Discord about the 5.1.3 csv exporter truncating stock prices to 2 decimal places, I noticed that the master branch csv export always seem to export the same account, which is NOT the one I selected. In playing with that further, if I pick an investment account in the account dropdown, and then change the separator from tab to comma, I get the popup that the account is invalid because it doesn't have any items. In trying to figure out why that happens, I put a qDebug at the beginning of CsvExportDlg::checkData which prints out the selected account. When I select the account (any account) with the dropdown, the correct account name is printed. However, if I make or change the separator selection, a DIFFERENT account name is selected. So - it turns out I can export the selected account only if I choose the separator first, and then the account.

Further, looking at CsvExportDlg::CsvExportDlg, I find the last three connect commads are:

connect(ui->m_accountComboBox, qOverload<int>(&QComboBox::currentIndexChanged), this, [this](int idx) {
        checkData(ui->m_accountComboBox->itemText(idx));
    });
connect(ui->m_separatorComboBox, QOverload<int>::of(&QComboBox::currentIndexChanged), this, [&](int index) {
        m_separator = m_fieldDelimiterCharList[index];
    } );
connect(ui->m_separatorComboBox, qOverload<int>(&QComboBox::currentIndexChanged), this, [this](int idx) {
        checkData(ui->m_accountComboBox->itemText(idx));
    });

Commenting out the third out seems to fix the problem of the wrong account. This might make sense as it looks like that call is connecting a change of the separator combobox to to calling checkData with an incorrect account name (using the index of the separator combobox, not of the account combobox. However, I'm not sure how (or even if) calling checkData with the "wrong" account name can actually change which account gets exported, although it is perhaps by selecting the splits to be exported based on the wrong account.

This post (https://stackoverflow.com/questions/16794695/connecting-overloaded-signals-and-slots-in-qt-5) related to the connecting of overloaded functions states that with C++11 you need QOverload<>::of(...) but with C++14 you need qOverload<>(...). This makes it look like our code has a mixture of both types of calls, and I wonder what subtle bugs this may have introduced.

I'll wait for some feedback before I actually try to fix this, while I continue to track down why the number of decimal places is truncated to 2 for prices and is too large for prices (which seems to be the same in 5.1 and master.)

Jack

Reply via email to