Russian Qt Forum

Qt => Пользовательский интерфейс (GUI) => Тема начата: mokynis от Февраль 02, 2010, 07:55



Название: очистка QComboBox
Отправлено: mokynis от Февраль 02, 2010, 07:55
Qt 4.3.2
имеется форма, на ней несколько ComboBox'ов, которые заполняются при открытии формы из MySQL-таблиц абсолютно одинаково:
Цитировать
    tmpstr="SELECT * FROM obtype ORDER BY tnam";
    qry->exec(tmpstr);
    while(qry->next())
    {
        vtype<<qry->value(0).toInt();
        ui->CBType->addItem(qry->value(1).toString());
    }
    tmpstr="SELECT * FROM kabs ORDER BY knam";
    qry->exec(tmpstr);
    while(qry->next())
    {
        vkab<<qry->value(0).toInt();
        ui->CBKab->addItem(qry->value(1).toString());
    }

время от времени содержимое исходных таблиц меняется и надо перезаполнять ComboBox'ы. Опять одинаково-сначала они очищаются, потом как при запуске формы. Так вот: все очищаются нормально, а при попытке очистить CBKab вылазит сообщение
Цитировать
ASSERT failure in QVector<T>::operator[]: "index out of range", file /usr/include/qt4/QtCore/qvector.h, line 319

и программа закрывается. При этом перед очисткой проверяю- qDebug()<<"CBKab: "<<ui->CBKab->count(); выдает, что Combo не пустой (да это и так видно).


Название: Re: очистка QComboBox
Отправлено: mokynis от Февраль 02, 2010, 07:57
Извиняюсь-вопрос то не задал: из-за чего такое может происходить? И как с ним бороться?


Название: Re: очистка QComboBox
Отправлено: voronElf от Февраль 02, 2010, 08:31
у тебя комбобоксы сигналами не связаны ? (насчет изменения текущего выделения и чего-нить в этом стиле). Проверь, чтобы при очистке не вызывались слоты, которые будут обращаться к уже пустым данным. Я частенько на такое попадаюсь при сложном интерфейсе.

PS: я так понял vtype и klab это векторы, в которых лежать id-шники таблиц. Почему бы не хранить эти данные в комбобоксе как Qt::UserRole (избавит от синхронизации векторов и комбобоксов) ?


Название: Re: очистка QComboBox
Отправлено: mokynis от Февраль 02, 2010, 08:56
СПАСИБО! Точно, CBKab упоминался еще в одном слоте-это его и губило. А можно чуть поподробнее про то, как занести данные в UserRole? А то сейчас одним глазом глянул в Assistant, а там только получение значения из UserRole увидел.


Название: Re: очистка QComboBox
Отправлено: Akaiten от Февраль 02, 2010, 09:42
А можно чуть поподробнее про то, как занести данные в UserRole?

См. последний параметр метода addItem():
Код
C++ (Qt)
ui->CBType->addItem(qry->value(1).toString(), qry->value(0).toInt());