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.
Lesezeichen