Seite 1 von 1

QCompleter und QListView

Verfasst: 25. Januar 2007 20:45
von QtBerserker
Ich habe ein Dialog mit zwei QListViews (listView und selectionView) sowie ein QLineEdit (editSelection) und versuche nun, in listView die komplette Liste, in selectionView die durch den QCompleter selektierte Liste anzeigen zu lassen. Leider klappt nicht mal das compilieren.

Code: Alles auswählen

class Widget : public QDialog, private Ui::Widget
...
Widget::Widget(QWidget* parent)
    : QDialog(parent)
{
    setupUi(this);

    QStringList list;
    list << "Homer Simpson"
         << "Marge Simpson"
         << "Bart Simpson"
         << "Liesa Simpson"
         << "Maggie Simpson"
         << "Philip J. Fry"
         << "Turanga Leela"
         << "Bender Bieger Rodriguez"
         << "Professor Hubert J. Farnsworth";

    QStringListModel m(list);

    listView->setModel(&m);

    m_completer = new QCompleter(this);
    m_completer->setModel(&m);
    editSelection->setCompleter(m_completer);
    m_completer->setPopup(selectionView);
}
Zum ersten setModel sagt er: virtual void QListWidget::setModel(QAbstractItemModel*)« ist privat
beim zweiten zur Runtime: QListWidget::setModel() - Changing the model of the QListWidget is not allowed (nachdem zuvor auskommentiert).

Wo ist mein Problem? Wie geht es richtig?

Vielen Dank
Olaf

Verfasst: 25. Januar 2007 21:23
von QtBerserker
Habe es nun mit dem Proxy versucht, aber es klappt noch immer nicht; immerhin muss man anscheinend QTreeView nehmen ...

Code: Alles auswählen

Widget::Widget(QWidget* parent)
    : QDialog(parent)
{
    setupUi(this);

    QStringList list;
    list << "Homer Simpson"
         << "Marge Simpson"
         << "Bart Simpson"
         << "Liesa Simpson"
         << "Maggie Simpson"
         << "Philip J. Fry"
         << "Turanga Leela"
         << "Bender Bieger Rodriguez"
         << "Professor Hubert J. Farnsworth";

    sourceModel = new QStringListModel(list, this);

    sourceView->setModel(sourceModel);

    proxyModel = new QSortFilterProxyModel(this);
    proxyModel->setSourceModel(sourceModel);
    proxyModel->setDynamicSortFilter(true);
    proxyModel->setFilterRegExp(
        QRegExp("*", Qt::CaseInsensitive,
                QRegExp::Wildcard));
    proxyModel->setFilterKeyColumn(0);

    proxyView->setModel(proxyModel);
}
Etwas vergessen?

Vielen Dank
Olaf

Verfasst: 25. Januar 2007 23:28
von upsala
QListWidget? QTreeView? Was willste jetzt eigentlich eine Liste oder einen Tree?

Verfasst: 26. Januar 2007 18:51
von QtBerserker
neuerdings einen Tree ;-) Habe das Konzept aktualisert. Die Idee mit dem Model ist ja, das es verschieden darstellbar ist.

Grüße
Olaf

Verfasst: 26. Januar 2007 19:22
von upsala
Schön, du willst also ein Model verwenden und für was dann das QTreeWidget und nicht die QTreeView?

Verfasst: 26. Januar 2007 21:03
von QtBerserker
ah, jetzt verstehe ich, was Du meintest, QTreeView wollte ich verwenden. Inzwischen habe ich das Problem gelöst: ich habe schlichtweg vergessen, die RegExpr für das Modell über das Edit jeweils zu setzten.

Allerdings habe ich nun ein anderes Problem.

Code: Alles auswählen

    class Widget
        : public QDialog, private Ui::Widget
    {
        Q_OBJECT

    public:
        Widget(QWidget* parent = 0);

    private slots:
        void selectionChanged(const QString& string);
        void selectedItem(const QModelIndex& index);
        void clearSelection();

    private:
        QStringListModel* sourceModel;
        QSortFilterProxyModel* proxyModel;
        bool onceSelected;
    };

Widget::Widget(QWidget* parent)
    : QDialog(parent),
      onceSelected(false)
{
    setupUi(this);

    QStringList list;
    list << "Homer Simpson"
         << "Marge Simpson"
         << "Bart Simpson"
         << "Liesa Simpson"
         << "Maggie Simpson"
         << "Philip J. Fry"
         << "Turanga Leela"
         << "Bender Bieger Rodriguez"
         << "Professor Hubert J. Farnsworth";

    sourceModel = new QStringListModel(list, this);

    sourceView->setModel(sourceModel);

    proxyModel = new QSortFilterProxyModel(this);
    proxyModel->setSourceModel(sourceModel);
    proxyModel->setDynamicSortFilter(true);
    proxyModel->setFilterKeyColumn(0);

    proxyView->setModel(proxyModel);

    connect(editSelection, SIGNAL(textEdited(const QString&)),
        this, SLOT(selectionChanged(const QString&)));

    connect(clearButton, SIGNAL(clicked()),
        this, SLOT(clearSelection()));

    connect(proxyView, SIGNAL(activated(const QModelIndex&)),
        this, SLOT(selectedItem(const QModelIndex&)));
}

void Widget::selectionChanged(const QString& string)
{
    if(!onceSelected)
    {
        editSelection->clear();
        editSelection->setText(string);
        qDebug() << ".";
        onceSelected = true;
    }

    proxyModel->setFilterRegExp(
        QRegExp(string, Qt::CaseInsensitive,
                QRegExp::Wildcard));
}
Ich habe im Designer einen Text in das QLineEdit editSelection geschrieben, welches beim ersten eingeben eines Buchstaben diesen Text für den Rest der Dialog Object Existens löscht. Aus irgendwelchen Gründen klappt dies aber nicht - die Ausgabe enthält zwei Punkte (selectionChanged wird demnach 2x aufgerufen) und der Text ist nicht weg; es wird einfach mein String/Buchstabe eingefügt/angehängt. Gelegentlich stürzt es auch ab, das gab es auch schon. Wo ist der Fehler??

Weiterhin wollte ich, dass beim Anklicken mi der Maus der Text ebenfalls verschwindet, habe aber kein Signal dafür in der Doku gefunden. Wenn es per Mausevent gehen muss, wie gehts das konkret? Ich müsste ja irgendwie wissen, das mein QLineEdit den Mouseevent bekommen hat.

Vielen Dank
Olaf

Verfasst: 29. Januar 2007 18:16
von QtBerserker
sind irgenwelche prinzipiellen Fehler enthalten?

Viele Grüße
Olaf