Qt: Пользовательский виджет в QScrollArea - PullRequest
4 голосов
/ 16 июня 2009

Я пытаюсь создать собственный виджет. Мой виджет отображается сам, если он не находится внутри области прокрутки. Код ниже работает. Если я изменю if (0) на if (1) внутри конструктора MainWindow, он не будет отображать строку "Hello World" Я предполагаю, что должен (повторно) реализовать некоторые дополнительные методы, но до сих пор я не смог найти правильные методы методом проб и ошибок.

// hellowidget.h
#ifndef HELLOWIDGET_H
#define HELLOWIDGET_H

#include <QtGui>

class HelloWidget : public QWidget
{
    Q_OBJECT
public:
    HelloWidget(QWidget *parent = 0);
    void paintEvent(QPaintEvent *event);
};

#endif // HELLOWIDGET_H

// hellowidget.cpp
#include "hellowidget.h"
HelloWidget::HelloWidget(QWidget *parent)
: QWidget(parent)
{
}
void HelloWidget::paintEvent(QPaintEvent *event)
{
     QPainter painter(this);
     painter.drawText(rect(), Qt::AlignCenter, "Hello World");
}

// mainwindow.h
#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QtGui>

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    MainWindow(QWidget *parent = 0);
    ~MainWindow();

private:
};

#endif // MAINWINDOW_H

// mainwindow.cpp
#include "mainwindow.h"
#include "hellowidget.h"

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
{
    HelloWidget *hello = new HelloWidget;
    QWidget *central = hello;

    if( 0 )
    {
        QScrollArea *scroll = new QScrollArea ;
        scroll->setWidget(hello);
        central = scroll;
    }

   setCentralWidget( central );
}

MainWindow::~MainWindow()
{
}

// main.cpp
#include <QtGui/QApplication>
#include "mainwindow.h"

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    MainWindow w;
    w.show();
    return a.exec();
}

Ответы [ 3 ]

8 голосов
/ 16 июня 2009

Вы просто должны указать свой HelloWidget размер и место.

Добавьте эту строку в свой код.

hello->setGeometry(QRect(110, 80, 120, 80)); 



Или, если вы хотите заполнить область прокрутки своим виджетом:

MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
{
    QScrollArea *const scroll(new QScrollArea);
    QHBoxLayout *const layout(new QHBoxLayout(scroll)); 
    HelloWidget *const hello(new HelloWidget);
    hello->setSizePolicy( QSizePolicy::Expanding, QSizePolicy::Expanding );
    layout->addWidget(hello);
    setCentralWidget( scroll );
}
3 голосов
/ 01 апреля 2010

Я тоже потянул за это волосы, но в итоге обнаружил, что QScrollArea setWidgetResizable , что позволило QScrollArea разрешить моему виджету расширяться, чтобы занять доступное пространство.

3 голосов
/ 16 июня 2009

Per Qt docs , "При использовании области прокрутки для отображения содержимого пользовательского виджета важно убедиться, что для подсказки размера дочернего виджета установлено подходящее значение. стандартный QWidget используется для дочернего виджета, может потребоваться вызвать QWidget :: setMinimumSize (), чтобы убедиться, что содержимое виджета правильно отображается в области прокрутки. "

Правильно ли работает, если вы следуете этим инструкциям?

...