Anzeige:
Ergebnis 1 bis 4 von 4

Thema: Qt: Inhalt von QScrollview wird nicht richtig aktualisiert

  1. #1
    Registrierter Benutzer
    Registriert seit
    23.05.2004
    Beiträge
    592

    Qt: Inhalt von QScrollview wird nicht richtig aktualisiert

    Ich habe eine Liste von Datensätzen die als kurze Textzeile angezeigt werden können. Dafür möchte ich ein Widget das Qt verwendet erstellen. Ich hatte mir gedacht das ich für jeden Datensatz ein Child-Widget erzeuge, z.B. ein QLineEdit. Da die Child-Widgets einfach untereinander angezeigt werden sollen verwende ich eine QVBox welche die Widgets als Children enthält. Die Anzahl der darzustellenden Datensätze ist variabel und kann so groß sein das der Platz auf dem Bildschirm nicht ausreicht um alle gleichzeitig anzuzeigen. Deshalb wollte ich die QVBox in ein QScrollView packen. Hiermit habe ich ein Problem: Der Inhalt des Scrollviews, also die QVBox, wird nicht gleich beim Erzeugen und Anzeigen der QScrollview richtig dargestellt. Man muss erst das Fenster der QScrollview in der Größe ändern. Seltsamerweise reicht es dazu nicht aus die resize Funktion aufzurufen, sondern ich muß tatsächlich das Fenster manuell mit der Maus ändern. Dieses Verhalten unterscheidet sich von der Situation in der die QVBox in einem einfachen QWidget ist. Dann wird der Inhalt "sofort" richtig angezeigt.

    Das folgende Programm verdeutlicht das Problem. Die Klassen A und B unterscheiden sich fast nur darin, dass A von QScrollview abgeleitet ist, und B von QWidget. Lege ich in der main Funktion ein B-Widget an und mach es das Hauptwidget wird gleich beim Programmstart die QVBox komplett fensterfüllend angezeigt. Man erkennt das deutlich an der roten Hintergrundfarbe. Tauscht man hingegen die Zeile ""B mainwindow;" in der main gegen "A mainwindow;" aus, dann füllt die QVBox beim Programmstart nicht das Fenster. Ich habe schon einige Sachen ausprobiert, z.B. resize() mit der QVBox und der QScrollview aufzurufen, oder update(), repaint(). Ich habe auch die viewportResize Funktion der QScrollview überschrieben und noch andere Sachen ausprobiert, aber ich bekomme das gewünschte Verhalten nicht gebastelt.

    Hier nun also der Code:
    Code:
    #include "qapplication.h"
    #include "qvbox.h"
    #include "qevent.h"
    #include "qlineedit.h"
    #include "qcolor.h"
    #include "qscrollview.h"
    #include "qwidget.h"
    
    class A : public QScrollView
    {
    public:
    A() : QScrollView(0), m_box(this->viewport() )
    	{
    	m_box.setPaletteBackgroundColor(QColor(255, 0, 0) );
    	this->addChild(&m_box);
    	new QLineEdit("abc", QString::null, &m_box);
    	}
    
    QVBox m_box;
    
    virtual void resizeEvent(QResizeEvent* p_ev)
    	{
    	QScrollView::resizeEvent(p_ev);
    	m_box.resize(p_ev->size() );
    	}
    
    };
    
    class B : public QWidget
    {
    public:
    B() : QWidget(0), m_box(this)
    	{
    	m_box.setPaletteBackgroundColor(QColor(255, 0, 0) );
    	new QLineEdit("abc", QString::null, &m_box);
    	}
    
    QVBox m_box;
    
    virtual void resizeEvent(QResizeEvent* p_ev)
    	{
    	QWidget::resizeEvent(p_ev);
    	m_box.resize(p_ev->size() );
    	}
    
    };
    
    int main(int argc, char* argv[])
    {
    QApplication app_obj(argc, argv);
    B mainwindow;
    app_obj.setMainWidget(&mainwindow);
    mainwindow.show();
    app_obj.exec();
    }
    Kann mir jemand helfen?

    Ich verwende Qt 3.3.6 für X11, zusammen mit dem GCC, Version 4.1.1.

  2. #2
    Administrator Avatar von anda_skoa
    Registriert seit
    17.11.2001
    Ort
    Graz, Österreich
    Beiträge
    5.477
    Wäre da ein QTable nicht besser geeignet?

    Ciao,
    _
    Qt/KDE Entwickler
    Debian Benutzer

  3. #3
    Registrierter Benutzer
    Registriert seit
    23.05.2004
    Beiträge
    592
    QTable werde ich mir mal ansehen, danke. Mein eigentliches Problem ist jetzt so mehr oder weniger behoben, nachdem ich noch mehr Widgets mit setMinimumSize ausgerüstet habe. Allerdings sind mir die Layout-Regeln immer noch ziemlich fremd, z.B. wird das letzte Child der QVBox anders skaliert als die restlichen, ohne ersichtlichen Grund. Ich füge jetzt einen Dummy, ein leeres QWidget als letztes ein um drumherum zu kommen.

  4. #4
    Administrator Avatar von anda_skoa
    Registriert seit
    17.11.2001
    Ort
    Graz, Österreich
    Beiträge
    5.477
    Oder ein QSpacerItem mit Vertical SizePolicy MinimumExpanding

    Aber vermutlich ist ein QTable in deinem Fall ohnehin die bessere Wahl.

    Ciao,
    _
    Qt/KDE Entwickler
    Debian Benutzer

Lesezeichen

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •