Russian Qt Forum

Qt => Общие вопросы => Тема начата: Gomerd от Февраль 02, 2011, 13:29



Название: QComboBox c повторами
Отправлено: Gomerd от Февраль 02, 2011, 13:29
Доброго времени суток, суть вопроса такова: как можно избавится от повторяющихся элементов в QComboBox'е, в справке не нашел ничего подходящего, неужели придется изобретать велосипед и писать проверку на повторы вручную?
Спасибо за внимание!


Название: Re: QComboBox c повторами
Отправлено: RedDog от Февраль 02, 2011, 13:44
duplicatesEnabled : bool
This property holds whether the user can enter duplicate items into the combobox.

Note that it is always possible to programmatically insert duplicate items into the combobox.

By default, this property is false (duplicates are not allowed).

Access functions:

bool   duplicatesEnabled () const
void   setDuplicatesEnabled ( bool enable )


Название: Re: QComboBox c повторами
Отправлено: Gomerd от Февраль 02, 2011, 13:47
Пробовал, ничего не происходит, как были повторы так они и остались


Название: Re: QComboBox c повторами
Отправлено: _govorilka от Февраль 02, 2011, 13:48
Из справки к классу QComboBox
Цитировать
...
Note that it is always possible to programmatically insert duplicate items into the combobox.
By default, this property is false (duplicates are not allowed).
...

Если добавляешь программно, то проверку нужно делать самому.

QComboBox можно привязать к QAbstractItemModel, все остальные контроли тоже. Тогда проверку нужно будет написать один раз.




Название: Re: QComboBox c повторами
Отправлено: Gomerd от Февраль 02, 2011, 13:49
вот так добавляю:
Код:
    QString fn = QFileDialog::getOpenFileName(this, tr("Open"));
    QFile file(fn);
    file.open(QFile::ReadOnly);
    QString line;
    QTextStream in(&file);
    QStringList string;
    while (!in.atEnd())
        {
            line = in.readLine();
            QString ch = ";";
            int l = 0;
            for (int i=0; i<line.length(); i++)
               {
                   if (line[i]==ch[0])
                      {
                         string<<line.mid(l,i-l);
                         ui->listWidget->addItem(line.mid(l,i-l));
                         l=i+1;
                      }
               }
            ui->comboBox->addItem(string[0]);
            qDebug()<<string;
            string.clear();
        }


Название: Re: QComboBox c повторами
Отправлено: _govorilka от Февраль 02, 2011, 13:58
Код:
    QString fn = QFileDialog::getOpenFileName(this, tr("Open"));
    QFile file(fn);
    if(file.open(QFile::ReadOnly))
    {
        QString line;
        QTextStream in(&file);
        QStringList strings;
        while (!in.atEnd())
        {
            line = in.readLine();
            for(int i=0, l = 0; i < line.length(); i++)
            {
                if(line[i] == QChar(';'))
                {
                    QString string = line.mid(l,i-l);
                    if(!strings.contains(string))
                    {
                        strings.append(string);
                    }
                    ui->listWidget->addItem(string);
                    l=i+1;
                }
            }
        }
        ui->comboBox->addItems(strings);
    }

Попробуй так


Название: Re: QComboBox c повторами
Отправлено: Gomerd от Февраль 02, 2011, 18:46
Код:
    QString fn = QFileDialog::getOpenFileName(this, tr("Open"));
    QFile file(fn);
    if(file.open(QFile::ReadOnly))
    {
        QString line;
        QTextStream in(&file);
        QStringList strings;
        while (!in.atEnd())
        {
            line = in.readLine();
            for(int i=0, l = 0; i < line.length(); i++)
            {
                if(line[i] == QChar(';'))
                {
                    QString string = line.mid(l,i-l);
                    if(!strings.contains(string))
                    {
                        strings.append(string);
                    }
                    ui->listWidget->addItem(string);
                    l=i+1;
                }
            }
        }
        ui->comboBox->addItems(strings);
    }

Попробуй так

все бы хорошо, но теперь он помещает в ComboBox все записи из .csv файла, а мне надо первую запись каждой строки ну ничего, тут додумаю. Спасибо)


Название: Re: QComboBox c повторами
Отправлено: _govorilka от Февраль 03, 2011, 07:30
Если первый запись, то тогда как-то так:

Код:
    QString fn = QFileDialog::getOpenFileName(this, tr("Open"));
    QFile file(fn);
    if(file.open(QFile::ReadOnly))
    {
       QTextStream in(&file);
       QStringList strings;
       while (!in.atEnd())
       {
           QString line = in.readLine();

           int separator = line.indexOf(';');
           QString comboBoxString = (separator != -1 ? line.left(separator) : line);
           if(!strings.contains(comboBoxString))
           {
               strings.append(comboBoxString);
           };

           for(int i=0, l = 0; i < line.length(); i++)
           {
               if(line[i] == QChar())
               {
                   QString string = line.mid(l,i-l);
                   ui->listWidget->addItem(string);
                   l=i+1;
               }
           }

       }
       ui->comboBox->addItems(strings);
    }


Название: Re: QComboBox c повторами
Отправлено: Gomerd от Февраль 03, 2011, 14:14
Сработало, большое спасибо за оперативную помощь)