QCompleter und QListView

Alles rund um die Programmierung mit Qt
Antworten
QtBerserker
Beiträge: 71
Registriert: 15. Mai 2006 09:07

QCompleter und QListView

Beitrag 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
QtBerserker
Beiträge: 71
Registriert: 15. Mai 2006 09:07

Beitrag 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
upsala
Beiträge: 3946
Registriert: 5. Februar 2006 20:52
Wohnort: Landshut
Kontaktdaten:

Beitrag von upsala »

QListWidget? QTreeView? Was willste jetzt eigentlich eine Liste oder einen Tree?
QtBerserker
Beiträge: 71
Registriert: 15. Mai 2006 09:07

Beitrag von QtBerserker »

neuerdings einen Tree ;-) Habe das Konzept aktualisert. Die Idee mit dem Model ist ja, das es verschieden darstellbar ist.

Grüße
Olaf
upsala
Beiträge: 3946
Registriert: 5. Februar 2006 20:52
Wohnort: Landshut
Kontaktdaten:

Beitrag von upsala »

Schön, du willst also ein Model verwenden und für was dann das QTreeWidget und nicht die QTreeView?
QtBerserker
Beiträge: 71
Registriert: 15. Mai 2006 09:07

Beitrag 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
QtBerserker
Beiträge: 71
Registriert: 15. Mai 2006 09:07

Beitrag von QtBerserker »

sind irgenwelche prinzipiellen Fehler enthalten?

Viele Grüße
Olaf
Antworten