QPushButtons zu QScrollArea hinzufügen und runterscrollen

Alles rund um die Programmierung mit Qt
Antworten
sanoj
Beiträge: 2
Registriert: 20. Februar 2008 12:34

QPushButtons zu QScrollArea hinzufügen und runterscrollen

Beitrag von sanoj »

Hi.

Ich habe folgende Situation: eine QScrollArea enthält ein QWidget mit QVBoxLayout. Das innere Widget enthält viele QPushButtons. Wenn ich auf einen Button klicke, soll ein neuer ganz am Ende angefügt werden und die QScrollArea soll ganz runter gescrollt werden.

Problem: zu dem Zeitpunkt, wo ich die verticalScrollBar() verschiebe, ist ihr maximum()-Wert noch der alte. So scrollt die QScrollArea nur bis zum vorletzten Button runter.

Interessanterweise funktionierts, wenn ich eine QMessageBox anzeige, direkt vor dem Code der runterscrollt...

Hier ist der Code:

Header:

Code: Alles auswählen

class MyWidget : public QWidget {
Q_OBJECT

public:
MyWidget(QWidget *parent = 0);
private:
QScrollArea* scroll;

public slots:
void trigger();
};
CPP:

Code: Alles auswählen

MyWidget::MyWidget(QWidget *parent) :
	QWidget(parent) {
	
	// set up QScrollArea containig one "vboxed" QWidget
	scroll = new QScrollArea(this);
	QWidget* innerWidget = new QWidget(scroll);
	innerWidget->setLayout(new QVBoxLayout());
	scroll->setWidget(innerWidget);
	scroll->setWidgetResizable(true);

	// set up outer layout containing QScrollArea
	QLayout* outerLayout = new QVBoxLayout();
	outerLayout->addWidget(scroll);
	setLayout(outerLayout);
	
	// add 1st QPushButton
	trigger();
}

// add PushButton at bottom of VBox
// scroll down (<<<<< doesn't work)
void MyWidget::trigger() {
	QPushButton* bt = new QPushButton("push me", scroll->widget());
	connect(bt, SIGNAL(clicked()), this, SLOT(trigger()));
	scroll->widget()->layout()->addWidget(bt);
	QMessageBox::warning(NULL, "", "");     // <<<<< if enabled, it works
	scroll->verticalScrollBar()->setValue(scroll->verticalScrollBar()->maximum());
}


int main(int argc, char *argv[]) {
	QApplication app(argc, argv);
	MyWidget widget;
	widget.show();
	return app.exec();
}
Irgendwelche Ideen?

System: Debian Linux, gcc 4.2.3, QT 4.3.3

Tschüs,
Jonas
upsala
Beiträge: 3946
Registriert: 5. Februar 2006 20:52
Wohnort: Landshut
Kontaktdaten:

Beitrag von upsala »

Statt QMessageBox ein QApplication::processEvents einfügen
sanoj
Beiträge: 2
Registriert: 20. Februar 2008 12:34

Beitrag von sanoj »

Danke, das war's (fast).
Es muss außerdem noch das innere Widget vergrößert werden. So klappt's:

Code: Alles auswählen

void MyWidget::trigger() {
   QPushButton* bt = new QPushButton("push me", scroll->widget());
   connect(bt, SIGNAL(clicked()), this, SLOT(trigger()));
   scroll->widget()->layout()->addWidget(bt);
   scroll->widget()->resize(scroll->widget()->sizeHint());                           // <<<<<<<<<<<<<<<<<
   qApp->processEvents();                                                                         // <<<<<<<<<<<<<<<<<
   scroll->verticalScrollBar()->setValue(scroll->verticalScrollBar()->maximum());
} 
Antworten