C++ MDIchild-QabstractScroll区域中的QWidget存在问题

C++ MDIchild-QabstractScroll区域中的QWidget存在问题,c++,qt,qwidget,C++,Qt,Qwidget,在我的开源项目中,我想添加一个扇区扫描函数。为此,我尝试创建一个类似于碎片整理软件产品的小部件。 除了我不能使控件可滚动的问题之外,一切都正常。我的代码将始终生成一个强制大小,以便mdichild(父级)将调整大小,并且滚动在MDI区域内而不是窗口内。表示它将从视图中滚动出MDI标题 我希望控件本身变成滚动条来滚动,mdichild窗口将保持其大小。我的代码是: MDICHild:MDICHild_scan.cpp #include <QtWidgets> #include "md

在我的开源项目中,我想添加一个扇区扫描函数。为此,我尝试创建一个类似于碎片整理软件产品的小部件。 除了我不能使控件可滚动的问题之外,一切都正常。我的代码将始终生成一个强制大小,以便mdichild(父级)将调整大小,并且滚动在MDI区域内而不是窗口内。表示它将从视图中滚动出MDI标题

我希望控件本身变成滚动条来滚动,mdichild窗口将保持其大小。我的代码是:

MDICHild:MDICHild_scan.cpp

#include <QtWidgets>
#include "mdichild_scan.h"
#include "FoxSDKBurningLib.h"
#include "mainwindow.h"
#include "settingspages.h"
#include "messanger.h"

MdiChildScan::MdiChildScan(QWidget* parent, const QString &device)
    :strBurnDrive(device){
    setAttribute(Qt::WA_DeleteOnClose);
    mProjectType = RuleManager::TYPE_PROJECT_DEVICEINFO;
    thisSuccessfullCreated = true;

    QString wTitle = tr("Hex ");
    wTitle += " (";
    wTitle += strBurnDrive;
    wTitle += ")";

    setWindowTitle(wTitle);

    QVBoxLayout * dlgSplitter = new QVBoxLayout(this);
    QHBoxLayout * topNav = new QHBoxLayout(this);
    QWidget * wdgSplitter = new QWidget(this);

    QLabel *labelTopNav = new QLabel(this);
    labelTopNav->setText(tr("This is a header"));
    topNav->addWidget(labelTopNav);
    topNav->setContentsMargins(1,8,1,0);

    dlgSplitter->setContentsMargins(0,0,0,0);
    dlgSplitter->setSpacing(0);
    dlgSplitter->setMargin(0);

    dlgSplitter->addLayout(topNav);

    scanBoard = new QScanBoard(45, 65);
    dlgSplitter->addWidget(scanBoard);



    wdgSplitter->setLayout(dlgSplitter);


    this->setSizePolicy(QSizePolicy::Minimum, QSizePolicy::Minimum);
    this->setCentralWidget(wdgSplitter);


}

#包括
#包括“mdichild\u scan.h”
#包括“FoxSDKBurningLib.h”
#包括“mainwindow.h”
#包括“settingspages.h”
#包括“messanger.h”
MdiChildScan::MdiChildScan(QWidget*父项、常量QString和设备)
:strBurnDrive(设备){
setAttribute(Qt::WA_DeleteOnClose);
mProjectType=RuleManager::TYPE\u PROJECT\u DEVICEINFO;
thisSuccessfullCreated=true;
QString wTitle=tr(“十六进制”);
wTitle+=“(”;
wTitle+=strBurnDrive;
wTitle+=”;
设置窗口标题(wTitle);
QVBoxLayout*dlgSplitter=新的QVBoxLayout(此);
QHBoxLayout*topNav=新的QHBoxLayout(本);
QWidget*wdgSplitter=新的QWidget(此);
QLabel*labelTopNav=新的QLabel(此);
labelTopNav->setText(tr(“这是一个标题”);
topNav->addWidget(labelTopNav);
topNav->setContentsMargins(1,8,1,0);
dlgSplitter->setContentsMargins(0,0,0,0);
dlgSplitter->setspace(0);
dlgSplitter->setMargin(0);
dlgSplitter->addLayout(topNav);
扫描板=新的QScanBoard(45,65);
dlgSplitter->addWidget(扫描板);
wdgSplitter->setLayout(dlgSplitter);
此->设置策略(QSizePolicy::Minimum,QSizePolicy::Minimum);
此->设置中心Widget(wdgSplitter);
}
mdichild_scan.h

#ifndef MDICHILD_SCAN_H
#define MDICHILD_SCAN_H

#include <QMainWindow>
#include <QtWidgets>
#include <QListView>
#include <QSplitter>
#include <QLabel>
#include "mdichild_base.h"
#include "FoxSDKBurningLib.h"
#include "vrulemanager.h"
#include "QScanBoard.h"

class MdiChildScan : public MdiChildBase
{
    Q_OBJECT

public:
    MdiChildScan(QWidget* parent, const QString &device);
    RuleManager::ProjectType GetProjectType() {return mProjectType;}
    bool thisSuccessfullCreated;

protected:
    RuleManager::ProjectType mProjectType;

    QString strBurnDrive;

private:
    QScanBoard* scanBoard;

};

#endif
\ifndef MDICHILD\u SCAN\u H
#定义MDICHILD\u扫描
#包括
#包括
#包括
#包括
#包括
#包括“mdichild_base.h”
#包括“FoxSDKBurningLib.h”
#包括“vrulemanager.h”
#包括“QScanBoard.h”
类MdiChildScan:公共MdiChildBase
{
Q_对象
公众:
MdiChildScan(QWidget*父项、常量QString和设备);
RuleManager::ProjectType GetProjectType(){return mProjectType;}
布尔成功地创建了这个模型;
受保护的:
RuleManager::ProjectType mProjectType;
QString strBurnDrive;
私人:
QScanBoard*扫描板;
};
#恩迪夫
控件itsel:QScanBoard.cpp

#include "QScanBoard.h"

#include <QGridLayout>
#include <QScrollBar>
#include <QSet>

QScanBoard::QScanBoard(unsigned int numRows, unsigned int numCols, QWidget* parent)
    : QAbstractScrollArea(parent)
    , m_numRows(numRows)
    , m_numCols(numCols)
{
    setupLayout();
    createTiles();

}

void QScanBoard::setupLayout()
{
    this->setAttribute(Qt::WA_LayoutUsesWidgetRect);
    this->setSizePolicy(QSizePolicy::Minimum, QSizePolicy::Minimum);
    auto layout = new QGridLayout;

    layout->setSpacing(0);
    layout->setMargin(0);
    layout->setContentsMargins(0, 0, 0, 0);
    layout->setSizeConstraint(QLayout::SetFixedSize);

    setLayout(layout);

    setFocusPolicy(Qt::StrongFocus);

    verticalScrollBar()->setValue(0);
}

void QScanBoard::createTiles()
{
    for (unsigned int r = 0; r < m_numRows; ++r)
    {
        m_tiles += QList<QScanTile*>{};
        for (unsigned int c = 0; c < m_numCols; ++c)
        {
            // add a new tile to the row
            m_tiles[r] += new QScanTile({ r, c }, this);
            static_cast<QGridLayout*>(this->layout())->addWidget(m_tiles[r][c], r, c);

        }
    }
    m_tiles[0][0]->setDown(true);

    viewport() -> update();
}

#包括“QScanBoard.h”
#包括
#包括
#包括
QScanBoard::QScanBoard(无符号整数行、无符号整数行、QWidget*父项)
:QAbstractScrollArea(父级)
,m_numRows(numRows)
,m_numCols(numCols)
{
setupLayout();
createTiles();
}
void QScanBoard::setupLayout()
{
这->设置属性(Qt::WA_LayoutUsesWidgetRect);
此->设置策略(QSizePolicy::Minimum,QSizePolicy::Minimum);
自动布局=新QGridLayout;
布局->设置间距(0);
布局->设置边距(0);
布局->设置内容边缘(0,0,0,0);
布局->setSizeConstraint(QLayout::SetFixedSize);
设置布局(布局);
setFocusPolicy(Qt::StrongFocus);
垂直滚动条()->设置值(0);
}
void QScanBoard::createTiles()
{
for(无符号整数r=0;rlayout())->addWidget(m_tiles[r][c],r,c);
}
}
m_tiles[0][0]->设置(真);
viewport()->update();
}
QScanBoard.h

#ifndef QSCANBOARD_H
#define QSCANBOARD_H

#pragma once
#include <QList>
#include <QFrame>
#include <QSet>
#include <QAbstractScrollArea>

#include "QScanTile.h"

class QScanBoard : public QAbstractScrollArea
{
    Q_OBJECT

public:

    QScanBoard(unsigned int numRows, unsigned int numCols, QWidget* parent = nullptr);

    unsigned int numCols() const { return m_numCols; }
    unsigned int numRows() const { return m_numRows; }


signals:

    void initialized();

private:

    void createTiles();
    void setupLayout();

private:

    unsigned int m_numRows;
    unsigned int m_numCols;

    QList<QList<QScanTile*>> m_tiles;

    QSet<QScanTile*> m_sectors;

};

#endif // QSCANBOARD_H
\ifndef QSCANBOARD\u H
#定义QSCANBOARD_H
#布拉格语一次
#包括
#包括
#包括
#包括
#包括“QScanTile.h”
QScanBoard类:公共QabStretchArea
{
Q_对象
公众:
QScanBoard(unsigned int numRows,unsigned int numCols,QWidget*parent=nullptr);
unsigned int numCols()常量{return m_numCols;}
unsigned int numRows()常量{return m_numRows;}
信号:
void初始化();
私人:
void createTiles();
void setupLayout();
私人:
无符号整数m_numRows;
无符号整数m_numCols;
QList m_瓷砖;
QSet m_部门;
};
#endif//QSCANBOARD\u H
进度项目:QScanTile.cpp

#include "QScanTile.h"

#include <thread>
#include <chrono>

#include <QDebug>
#include <QState>
#include <QFinalState>
#include <QMouseEvent>
#include <QSizePolicy>

const QString QScanTile::unrevealedStyleSheet =
"QScanTile"
"{"
"   border: 1px solid darkgray;"
"   background: qradialgradient(cx : 0.4, cy : -0.1, fx : 0.4, fy : -0.1, radius : 1.35, stop : 0 #fff, stop: 1 #bbb);"
"   border - radius: 1px;"
"}";
const QString QScanTile::revealedStyleSheet =
"QScanTile"
"{"
"   border: 1px solid lightgray;"
"}";
const QString QScanTile::revealedWithNumberStylesheet =
"QScanTile"
"{"
"   color: %1;"
"   font-weight: bold;"
"   border: 1px solid lightgray;"
"}";

QIcon QScanTile::blankIcon()
{
    static QIcon icon = QIcon();
    return icon;
}

QScanTile::QScanTile(QScanTileLocation location, QWidget* parent /*= nullptr*/)
    : m_adjacentFlaggedCount(0)
    , m_location(location)
    , QPushButton(parent)
{
    this->setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Fixed);
    setCheckable(true);

    this->setIcon(blankIcon());
    this->setStyleSheet(unrevealedStyleSheet);
}

QScanTile::~QScanTile()
{

}



QScanTileLocation QScanTile::location() const
{
    return m_location;
}


QSize QScanTile::sizeHint() const
{
    return QSize(12, 12);
}


#包括“QScanTile.h”
#包括
#包括
#包括
#包括
#包括
#包括
#包括
const QString QScanTile::unrevealedStyleSheet=
“QScanTile”
"{"
“边框:1px实心暗光线;”
背景:Q辐射半径(cx:0.4,cy:-0.1,fx:0.4,fy:-0.1,半径:1.35,停止:0#fff,停止:1#bbb)
“边界-半径:1px;”
"}";
const QString QScanTile::revealedStyleSheet=
“QScanTile”
"{"
“边框:1px实心浅灰色;”
"}";
const QString QScanTile::用NumberStyleSheet显示=
“QScanTile”
"{"
“颜色:%1;”
“字体大小:粗体;”
“边框:1px实心浅灰色;”
"}";
QIcon QScanTile::blankIcon()
{
静态QIcon图标=QIcon();
返回图标;
}
QScanTile::QScanTile(QScanTileLocation位置,QWidget*parent/*=nullptr*/)
:m_adjacentFlaggedCount(0)
,m_位置(位置)
,QPushButton(父级)
{
此->设置izepolicy(QSizePolicy::Fixed,QSizePolicy::Fixed);
可设置检查(真);
此->设置图标(blankIcon());
此->设置样式表(未公布的样式表);
}
QScanTile::~QScanTile()
{
}
QScanTileLocation QScanTile::location()常量
{
返回m_位置;
}
QSize QScanTile::sizeHint()常量
{
返回QSize(12,12);
}
QScanTile.h

#ifndef QSCANTILE_H
#define QSCANTILE_H

#pragma once
#include <QPushButton>
#include <QList>
#include <QStateMachine>
#include <QState>
#include <QFinalState>
#include <QSignalMapper>

struct QScanTileLocation
{
    unsigned int row;
    unsigned int column;
};

class QScanTile : public QPushButton
{
    Q_OBJECT
public:

    QScanTile(QScanTileLocation location, QWidget* parent = nullptr);
    virtual ~QScanTile() override;

    QScanTileLocation location() const;

    virtual QSize sizeHint() const override;

    static QIcon blankIcon();

private:
    QScanTileLocation m_location;

    static const QString unrevealedStyleSheet;
    static const QString revealedStyleSheet;
    static const QString revealedWithNumberStylesheet;

};

#endif // QSCANTILE_H

#如果没有
#定义QSCANTILE_H
#布拉格语一次
#包括
#包括
#包括
#包括
#包括
#包括
结构QS悬臂定位
{
无符号整数行;
无符号整数列;
};
QScanTile类:公共QPushButton
{
Q_对象
公众:
QScanTile(QScanTileLocation位置,QWidget*parent=nullptr);
virtual~QScanTile()覆盖;
QScanTileLocation()常量;
虚拟QSize sizeHint()常量覆盖;
静态奇康blankIco
   scanBoard = new QScanBoard(200, 83);

    scrollArea->setWidget(scanBoard);