#include class TableWidget : public QTableWidget { public: TableWidget(int rows, int columns, QWidget* parent) : QTableWidget(rows, columns, parent) { setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding); } QSize sizeHint () const { qDebug() << "table size hint"; int newWidth = 0; int newHeight =0; for (int i = 0; i < columnCount(); i++) { newWidth+= columnWidth(i); } for (int y = 0; y < rowCount(); y++) { newHeight+= rowHeight(y); } newWidth+=verticalHeader()->width() + 2 *frameWidth(); newHeight+= horizontalHeader()->height() +2 *frameWidth(); return QSize(newWidth, newHeight); } }; class ScrollArea : public QScrollArea { public: ScrollArea(QWidget *parent) : QScrollArea(parent) { setSizePolicy(QSizePolicy::Maximum, QSizePolicy::Maximum); } QRect myDesktopRect() const { QDesktopWidget* pDesktop = QApplication::desktop(); QRect rect = pDesktop->availableGeometry(0); rect.setHeight(rect.height() - (frameGeometry().height() - geometry().height())); rect.setWidth(rect.width() - (frameGeometry().width() - geometry().width())); return rect; } QSize sizeHint() const { qDebug() << "sizeHint called for scrollarea"; QSize widgetSize(-1,-1); int f = 2 * frameWidth(); QSize sz(f, f); int h = fontMetrics().height(); QWidget* w = widget(); if (w) { if (!widgetSize.isValid()) widgetSize = widgetResizable() ? w->sizeHint() : w->size(); qDebug() << widgetSize; sz += widgetSize; } else { sz += QSize(12 * h, 8 * h); } if (verticalScrollBarPolicy() == Qt::ScrollBarAlwaysOn) sz.setWidth(sz.width() + verticalScrollBar()->sizeHint().width()); if (horizontalScrollBarPolicy() == Qt::ScrollBarAlwaysOn) sz.setHeight(sz.height() + horizontalScrollBar()->sizeHint().height()); sz.setWidth(qMin(QApplication::desktop()->availableGeometry().width(), sz.width())); sz.setHeight(qMin(QApplication::desktop()->availableGeometry().height(), sz.height())); return sz; // return sz.boundedTo(QSize(36 * h, 24 * h)); } }; class EcuTableView : public QWidget { Q_OBJECT public: EcuTableView() : QWidget() { firstTime = true; mainLayout = new QVBoxLayout(this); QMenuBar *menuBar = new QMenuBar(this); menuBar->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Fixed); QMenu *menu = menuBar->addMenu("Add widgets"); tableAction = menu->addAction("Hide table"); tableAction->setCheckable(true); labelAction = menu->addAction("Hide label"); labelAction->setCheckable(true); editAction = menu->addAction("Hide textedit"); editAction->setCheckable(true); scrollArea = new ScrollArea(this); mainLayout->addWidget(menuBar); mainLayout->addWidget(scrollArea); QWidget *scrollChild = new QWidget(scrollArea); scrollChild->setSizePolicy(QSizePolicy::Maximum, QSizePolicy::Maximum); QGridLayout *tableLayout = new QGridLayout(scrollChild); data = new TableWidget(50,50, scrollChild); xLabel = new QLabel(scrollChild); QPixmap pix2(500,500); pix2.fill(Qt::blue); xLabel->setPixmap(pix2); QLabel *secondLabel = new QLabel(scrollChild); QPixmap pix(500,500); pix.fill(Qt::red); secondLabel->setPixmap(pix); descText = new QTextEdit("A QTextEdit", scrollChild); tableLayout->addWidget(data); tableLayout->addWidget(xLabel); tableLayout->addWidget(descText); tableLayout->addWidget(secondLabel); scrollArea->setWidgetResizable(true); scrollArea->setWidget(scrollChild); setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding); connect(tableAction, SIGNAL(toggled(bool)), this, SLOT(tableChange(bool))); connect(labelAction, SIGNAL(toggled(bool)), this, SLOT(labelChange(bool))); connect(editAction, SIGNAL(toggled(bool)), this, SLOT(editChange(bool))); } QSize sizeHint() const { qDebug() << "sizehint called for toplevel window"; return QWidget::sizeHint(); } private: bool firstTime; QVBoxLayout *mainLayout; TableWidget *data; QLabel *xLabel; QTextEdit *descText; QAction *tableAction; QAction *labelAction; QAction *editAction; ScrollArea *scrollArea; public slots: void tableChange(bool showIt) { if (showIt){ tableAction->setText("Show Table"); data->hide(); layout()->invalidate(); resize(sizeHint()); }else { tableAction->setText("Hide Table"); data->show(); layout()->invalidate(); resize(sizeHint()); }} void labelChange(bool showIt) { if (showIt){ labelAction->setText("Show Label"); xLabel->hide(); layout()->invalidate(); resize(sizeHint()); }else { labelAction->setText("Hide Label"); xLabel->show(); layout()->invalidate(); resize(sizeHint()); }} void editChange(bool showIt) { if (showIt){ editAction->setText("Show Editor"); descText->hide(); layout()->invalidate(); resize(sizeHint()); }else { labelAction->setText("Hide Editor"); descText->show(); layout()->invalidate(); resize(sizeHint()); }} }; #include "main.moc" int main(int argc, char** argv) { QApplication app(argc, argv); EcuTableView view; view.show(); view.resize(view.sizeHint()); qDebug() <<"main" << view.sizeHint(); qDebug() <<"main" << view.size(); view.move(0,0); return app.exec(); }