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