Полосы прокрутки с помощью QScrollArea - PullRequest
0 голосов
/ 14 сентября 2018

Я создал две области прокрутки в Qt Designer. Каждый из них имеет размеры [(31,48) 1141 x 161] и [(31, 310) 1141 x 101] соответственно. Затем я создал две копии виджетов класса TimeDiagram и установил их размеры, которые больше размеров соответствующих областей прокрутки. И тогда я установил объекты в области. Вертикальные и горизонтальные полосы прокрутки включены.

Конструктор окна:

GraphicScaleDialog::GraphicScaleDialog(OutputData *outputData, QWidget *parent) :
    QDialog(parent),
    ui(new Ui::GraphicScaleDialog) {
    ui->setupUi(this);

    data = outputData;

    commonSAGridSpacing = 120;
    commonSAScale = 15;
    resultsSAGridSpacing = 120;
    resultsSAScale = 15;

    ui->commonSAGridSpacing_line->setText(QString::number(commonSAGridSpacing));
    ui->commonSAScale_line->setText(QString::number(commonSAScale));
    ui->resultsSAGridSpacing_line->setText(QString::number(resultsSAGridSpacing));
    ui->resultsSAScale_line->setText(QString::number(resultsSAScale));

    commonArea = ui->commonScrollArea;
    commonArea->setVerticalScrollBarPolicy(Qt::ScrollBarAsNeeded);
    commonArea->setHorizontalScrollBarPolicy(Qt::ScrollBarAsNeeded);
    resultsArea = ui->resultsScrollArea;
    resultsArea->setVerticalScrollBarPolicy(Qt::ScrollBarAsNeeded);
    resultsArea->setHorizontalScrollBarPolicy(Qt::ScrollBarAsNeeded);

    commonDiagramWidget = new TimeDiagram(20, this);
    commonDiagramWidget->setGeometry(31, 41, 2000, static_cast<int>(data->outputSettings.flowQuantity * commonDiagramWidget->rowHeight));
    resultsDiagramWidget = new TimeDiagram(100, this);
    resultsDiagramWidget->setGeometry(31, 114, 2000, 101);

    commonArea->setWidget(commonDiagramWidget);
    resultsArea->setWidget(resultsDiagramWidget);

    commonArea->show();
    resultsArea->show();
}

Diagrams

Проблема заключается в создании двух сеток с осью шкалы времени.

Это правильно, что мне нужно использовать QPainter для этой проблемы?

UPD: Может быть проблема в методах TimeDiagram?

void TimeDiagram::paintEvent(QPaintEvent * /* event */) {
    QPainter  painter(this);
    draw(&painter);
}

//--------------------------------------------------------------

void TimeDiagram::draw(QPainter *painter) {
    painter->setRenderHint(QPainter ::NonCosmeticDefaultPen, true);
    QPen* pen = new QPen();
    pen->setWidth(1);

    pen->setColor(Qt::black);
    painter->setPen(*pen);
    for (int i = static_cast<int>(rowHeight); i < this->height(); i += static_cast<int>(rowHeight))
    //for (unsigned int counter = 0; counter < static_cast<GraphicScaleDialog *>(this->parent())->data->outputSettings.flowQuantity; counter++)
        painter->drawLine(0, i, this->width(), i);

    pen->setColor(Qt::lightGray);
    painter->setPen(*pen);
    for(int i = 0; i < this->width(); i += 30)
      painter->drawLine(i, 0, i, this->height());

    delete pen;
}

Ответы [ 2 ]

0 голосов
/ 14 сентября 2018

Ваш TimeDiagram виджет должен переопределить sizeHint(), чтобы сообщить макетам его предпочтительный размер. Используется QScrollArea для определения размера отображаемых виджетов.

Базовая реализация QWidget будет использовать минимальный размер, поэтому это должно работать:

commonDiagramWidget->setMinimumSize(2000, static_cast<int>(data->outputSettings.flowQuantity * commonDiagramWidget->rowHeight));
resultsDiagramWidget->setMinimumSize(2000, 101);

См. QScrollArea Документы

0 голосов
/ 14 сентября 2018

В Designer в свойстве QScrollArea снимите флажок widgetResizable или используйте QScrollArea::setWidgetResizable, чтобы отключить его программным способом.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...