Seite 1 von 1

QListView paintEvebn wid nicht gefangen?

Verfasst: 26. Mai 2010 15:06
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ß

Verfasst: 26. Mai 2010 15:15
von franzf
Hast du paintEvent überschrieben? Wenn ja kannst du das mal posten?

Re

Verfasst: 26. Mai 2010 17:18
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

Nochmals

Verfasst: 26. Mai 2010 17:38
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);
}


Re

Verfasst: 26. Mai 2010 20:57
von cefour
keiner eine Idee

Verfasst: 26. Mai 2010 22:48
von Christian81
Gib uns ein minmal kompilierbares Beispiel und wir werden sehen was falsch läuft.

Verfasst: 26. Mai 2010 23:07
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.

Re

Verfasst: 27. Mai 2010 10:58
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.

Re: Re

Verfasst: 27. Mai 2010 11:28
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.