Seite 1 von 1

QPushButtons zu QScrollArea hinzufügen und runterscrollen

Verfasst: 20. Februar 2008 12:42
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

Verfasst: 20. Februar 2008 13:52
von upsala
Statt QMessageBox ein QApplication::processEvents einfügen

Verfasst: 20. Februar 2008 16:26
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());
}