QListView paintEvebn wid nicht gefangen?

Alles rund um die Programmierung mit Qt
Antworten
cefour
Beiträge: 8
Registriert: 1. März 2010 13:57

QListView paintEvebn wid nicht gefangen?

Beitrag von cefour »

Hallo Leute, ich bin ein wenig ratlos bei meinem derzeitigen Problem. Ich nutze derzeitig
ein Klasse welche von QListView abgeleitet ist, um meine Daten anzuzeigen. Leider wird dann nur trotz vorhanden Daten in der Model Klasse nur eine Graue Fläche angezeigt.
Soviel kann ich sagen die Model Klasse funktioniert, da sie wenn ich nur QLIstView verwende die Daten anzeigt.
Ich konnte das Problem soweit eingrenzen: Es wir kein paintEvent ausgelöst und
nun zu meiner Frage weiss jemand woran das liegen kann, und wenn nein weiss jemand wie man herrauskriegt welche Klasse denn das paintEvent bekommt

Mit freundlichen Gruß
franzf
Beiträge: 3114
Registriert: 31. Mai 2006 11:15

Beitrag von franzf »

Hast du paintEvent überschrieben? Wenn ja kannst du das mal posten?
cefour
Beiträge: 8
Registriert: 1. März 2010 13:57

Re

Beitrag von cefour »

Ich habe das Paint Event nur zu testzwecken so überschrieben

Code: Alles auswählen

void ListView::paintEvent(QPaintEvent * e)
{
       std::cout<<"Paint Event aufrufen\n";
        QListView::paintEvent(e);
}
Deshalb weiss ich überhaupt das kein PaintEvent aufgerufen wird
cefour
Beiträge: 8
Registriert: 1. März 2010 13:57

Nochmals

Beitrag von cefour »

Hier noch die Klasse, aber ich denke mittlerweile das die Klasse nicht das Problem sein kann!

Code: Alles auswählen

ListView::ListViewt(QWidget * w) :
    QListView()

    setUniformItemSizes(true);
    setSelectionBehavior(QAbstractItemView::SelectItems);
    setSelectionMode(QAbstractItemView::SingleSelection);

    
    this->_popupFrame = new QFrame(0, Qt::Popup);
    this->_popupFrame->setFrameStyle(frameStyle());


    setFrameStyle(QFrame::NoFrame);
    setParent(this->_popupFrame);

    this->_popupFrame->setObjectName("_popupFrame");

    this->_popupFrame->setAttribute(Qt::WA_DeleteOnClose);

    QVBoxLayout *layout = new QVBoxLayout(this->_popupFrame);

    layout->setMargin(0);
    layout->addWidget(this);

    setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
    this->_popupFrame->setMinimumSize(1,1);
    setStyle(QApplication::style());
    setMinimumSize(1,1);
    this->_model = 0;


}


void ListView::SetItems(QList<CompletionItemStruct> &items)
{

    if(!this->_model)
    {
        this->_model = new AutoCompleteModel(0,items);
        this->setModel(this->_model);

    }
    else
    {
        this->_model->SetItems(items);
    }

    this->setCurrentIndex(this->_model->index(0));
}


void ListView::ShowList(int startPos)
{
    this->UpdatePositionAndSize(startPos);
    this->_popupFrame->show();
    show();
    setFocus();
}


void ListView::CloseList(const QModelIndex &index )
{


    close();
    if (this->_popupFrame)
    {
        this->_popupFrame->close();
        this->_popupFrame = 0;
    }


}

bool ListView:event(QEvent *e)
{
   
    if(e->type() == QEvent::FocusOut)
    {
        this->CloseList();
        return true;
    }
    return QListView::event(e);

}


void ListView::WindowActivated(const QModelIndex &index)
{
   CloseList(index);
}


void ListView::UpdatePositionAndSize(int startPos)
{
    // Kein Relevanter Code

}

void ListView::paintEvent(QPaintEvent *e)
{
    std::cout<<"Probe\n";
    QListView::paintEvent(e);
}

cefour
Beiträge: 8
Registriert: 1. März 2010 13:57

Re

Beitrag von cefour »

keiner eine Idee
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Beitrag von Christian81 »

Gib uns ein minmal kompilierbares Beispiel und wir werden sehen was falsch läuft.
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
franzf
Beiträge: 3114
Registriert: 31. Mai 2006 11:15

Beitrag von franzf »

Es liegt definitiv nicht an dem paintEvent.

Code: Alles auswählen

#include <QListView>
#include <QStandardItemModel>
#include <QApplication>
#include <QDebug>

class ListView : public QListView {
    void paintEvent(QPaintEvent* e) {
        qDebug() << "ListView::paintEvent()";
        QListView::paintEvent(e);
    }
};

int main(int argc, char** argv) {
    QApplication app(argc, argv);
    ListView view;
    QStandardItemModel model;

    model.appendRow(new QStandardItem("Mamma"));
    model.appendRow(new QStandardItem("Mia"));
    model.appendRow(new QStandardItem("Maccheroni"));
    model.appendRow(new QStandardItem("Marciale"));

    view.setModel(&model);
    view.show();

    return app.exec();
}
funktioniert prächtelig.
Und wenn du das QListView::paintEvent anschaust: das zeichnet auf dem viewport(), sei also gleich vorneweg gewarnt - habs nicht probiert kann mir aber denken, dass ein "QPainter(this)" Probleme bereitet.

Will aber anmerken, dass ich bei deinem Code keine Stelle erkennen kann, die ein Ableiten von QListView rechtfertigen würde. Du willst eher ein QListView als Member nutzen.
cefour
Beiträge: 8
Registriert: 1. März 2010 13:57

Re

Beitrag von cefour »

Also erstmal das folgendes, ich erstelle deshlb eine eigene Klasse da ich diese Klasse zum auto Vervolständigen innerhalb eines QTextPlainWidget verwende. Und ich eine ListBox brauche ohne Rahmen und Fensterleiste. Weiterhin in der Funktion UpdatePosAndSize wird wiederum auf meinen Editor zugegriffen um an der Cursor des Editors das ListView auf poppen zu lassen. Ich denke das sind die Regeln einer guten Objektorientierten Software, die EditorKlasse soll sich um den Editor kümmern während die ListBoxKlasse nur zum erstellen anzeigen der ListBox kümmert.

Zum Thema minimal Beispiel ist folgendes Problem:
Ich kann keines geben denn die minimal Beispiele Funktionieren. Es läuft nur nicht wenn ich es mein System anschliessend einbaue. Deshlab habe ich auch eingangs erwähnt, das ich befürchte, das der PaintEvent für die ListBox von einer anderen Klasse gefangen wird. Ich wüsste nur nicht warum.

Hat jemand eine Idee wie man herrausfinden kann ob ein Event irgendwie verworfen wird, oder nicht.
franzf
Beiträge: 3114
Registriert: 31. Mai 2006 11:15

Re: Re

Beitrag von franzf »

cefour hat geschrieben:Hat jemand eine Idee wie man herrausfinden kann ob ein Event irgendwie verworfen wird, oder nicht.
Wenn es verworfen wird, dann durch dich ;)
Wenn du es nicht selber schaffst, hilfts nicht und du musst uns dein Projekt zeigen (bitte kompilierbar und von allen Binaries - exe, libs, etc - befreit und komprimiert hier über die "Attachment"-Funktion der Forensoftware hochladen).

Zum Problem OOP-Design:
Wenn du das QPlainTextEdit mit Autovervollständigung ausstatten willst, hast du wahrscheinlich das edit eh schon abgeleitet. Das Edit kümmert sich um Events und weiß dadurch genau an welcher Stelle die Liste aufpopppen muss, und auch wie groß es sein muss. Da braucht es dann eigentlich kein QListView mehr abzuleiten.
Im Gegenteil: die ListBox soll gar nicht wissen wo sie jetzt gerade angezeigt wird, das soll ihr von außen gesagt werden, und ein Zugriff aus ListBox zurück in das PlainTextEdit gibt ihr sehr viel Macht (ich weiß nicht wie das bei dir genau geregelt wird). Für Kommunikation gibt es ja eigentlich SIGNAL/SLOT.
Antworten