Qt5:显示带有布局的QPaint
我不久前开始使用Qt5,但我不知道如何设置绘图在窗口中的位置 我有一个Drawing类,它是一个QWidget,包含我的paintEvent()函数和其他函数;以及一个包含一些小部件的主窗口类。因此,为了显示我的QPaint,我必须将其包含在我的布局中,这是主窗口布局,但窗口根本不适应QPaint;按钮、滑块的尺寸。。调整以组织自己并占据我窗口的所有空间,但他们完全忽略我的Qpainter,如果我放置至少2个小部件,它就会部分消失 您是否有更好地管理这些要素位置的解决方案 main.cpp:Qt5:显示带有布局的QPaint,qt,layout,qt5,qpainter,Qt,Layout,Qt5,Qpainter,我不久前开始使用Qt5,但我不知道如何设置绘图在窗口中的位置 我有一个Drawing类,它是一个QWidget,包含我的paintEvent()函数和其他函数;以及一个包含一些小部件的主窗口类。因此,为了显示我的QPaint,我必须将其包含在我的布局中,这是主窗口布局,但窗口根本不适应QPaint;按钮、滑块的尺寸。。调整以组织自己并占据我窗口的所有空间,但他们完全忽略我的Qpainter,如果我放置至少2个小部件,它就会部分消失 您是否有更好地管理这些要素位置的解决方案 main.cpp: #
#include <QtGui>
#include <QApplication>
#include "mywidget.h"
int main( int argc, char **argv )
{
QApplication app(argc, argv);
MainWindow window;
window.show();
return app.exec();
}
#包括
#包括
#包括“mywidget.h”
int main(int argc,字符**argv)
{
QApplication应用程序(argc、argv);
主窗口;
window.show();
返回app.exec();
}
mywidget.h:
#ifndef MYWIDGET_H
#define MYWIDGET_H
#include <QtGui>
#include <QWidget>
#include <QSlider>
#include <QScrollBar>
#include <QApplication>
#include <QGridLayout>
#include <QObject>
#include <QPoint>
#include <QLabel>
#include <QPolygon>
class Drawing : public QWidget
{
Q_OBJECT
public:
Drawing();
void paintEvent(QPaintEvent* e);
public slots:
void slide(int abscisse);
void rotate();
private:
QPoint o;
QPoint a;
QPoint b;
QPoint c;
QPoint d;
};
//--------------------------------------
class MainWindow : public QWidget
{
Q_OBJECT
public:
MainWindow();
private:
QSlider* m_slider1;
QSlider* m_slider2;
QGridLayout* m_layout;
Drawing* m_dessin;
};
#endif // MYWIDGET_H
\ifndef MYWIDGET\u H
#定义MYWIDGET_H
#包括
#包括
#包括
#包括
#包括
#包括
#包括
#包括
#包括
#包括
类绘图:公共QWidget
{
Q_对象
公众:
绘图();
无效油漆事件(QPaintEvent*e);
公众时段:
空幻灯片(int横坐标);
void rotate();
私人:
Qpo点;
a点;
b点;
c点;
点d;
};
//--------------------------------------
类主窗口:公共QWidget
{
Q_对象
公众:
主窗口();
私人:
QSlider*m_滑块1;
QSlider*m_滑块2;
QGridLayout*m_布局;
图纸*m_Desin;
};
#endif//MYWIDGET_H
mywidget.cpp:
#include "mywidget.h"
#include <iostream> //POUR LES TESTS
MainWindow::MainWindow() : QWidget()
{
setGeometry(330, 140, 840, 620);
m_slider1 = new QSlider(Qt::Horizontal, this);
m_slider1->setRange(150, 650);
m_slider1->setSliderPosition(400);
m_slider2 = new QSlider(Qt::Horizontal, this);
m_slider2->setSliderPosition(50);
m_layout = new QGridLayout;
m_layout->addWidget(new QLabel("Translation Horizontale"), 1, 0);
m_layout->addWidget(m_slider1, 2, 0);
m_layout->addWidget(new QLabel("Rotation"), 0, 1);
m_layout->addWidget(m_slider2, 1, 1);
m_dessin = new Drawing;
m_layout->addWidget(m_dessin, 0, 0);
setLayout(m_layout);
QObject::connect(m_slider1, SIGNAL(valueChanged(int)), m_dessin, SLOT(slide(int)));
QObject::connect(m_slider2, SIGNAL(valueChanged(int)), m_dessin, SLOT(rotate()));
}
//--------------------------------------------------------
Drawing::Drawing() : QWidget(), o(400, 150), a(o.x()-50 , o.y()-50), b(o.x()+50 , o.y()-50), c(o.x()+50 , o.y()+50), d(o.x()-50 , o.y()+50) {}
void Drawing::paintEvent(QPaintEvent *e) {
QPolygon poly;
poly << a << b << c << d;
QWidget::paintEvent(e); // effectue le comportement standard
QPainter painter(this); // construire
painter.setPen( QPen(Qt::white, 2) ); // personnaliser
painter.drawPolygon(poly); // dessiner
}
void Drawing::slide(int abscisse) {
if (a == QPoint(o.x()-50 , o.y()-50)) {
o.setX(abscisse);
a.setX(o.x()-50);
b.setX(o.x()+50);
c.setX(o.x()+50);
d.setX(o.x()-50);
}
else {
o.setX(abscisse);
a.setX(o.x());
b.setX(o.x()+75);
c.setX(o.x());
d.setX(o.x()-75);
}
update();
}
void Drawing::rotate() {
if (a == QPoint(o.x()-50 , o.y()-50)) {
a = QPoint(o.x() , o.y()+75);
b = QPoint(o.x()+75 , o.y());
c = QPoint(o.x() , o.y()-75);
d = QPoint(o.x()-75 , o.y());
}
else {
a = QPoint(o.x()-50 , o.y()-50);
b = QPoint(o.x()+50 , o.y()-50);
c = QPoint(o.x()+50 , o.y()+50);
d = QPoint(o.x()-50 , o.y()+50);
}
update();
}
#包括“mywidget.h”
#包括测试
MainWindow::MainWindow():QWidget()
{
集合几何(330、140、840、620);
m_slider1=新的QSlider(Qt::Horizontal,this);
m_滑块1->设置范围(150650);
m_滑块1->设置滑块位置(400);
m_slider2=新的QSlider(Qt::水平,本);
m_滑块2->设置滑块位置(50);
m_布局=新的QGridLayout;
m_layout->addWidget(新的QLabel(“Translation Horizontale”),1,0;
m_布局->添加小部件(m_滑块1、2、0);
m_布局->添加小部件(新的QLabel(“旋转”),0,1);
m_布局->添加小部件(m_滑块2,1,1);
m_dessin=新图纸;
m_布局->添加小部件(m_dessin,0,0);
设置布局(m_布局);
QObject::connect(m_滑块1,信号(值更改(int)),m_dessin,插槽(滑块(int));
QObject::connect(m_滑块2,信号(值更改(int)),m_dessin,插槽(旋转());
}
//--------------------------------------------------------
绘图:绘图():QWidget(),o(400150),a(o.x()-50,o.y()-50),b(o.x()+50,o.y()-50),c(o.x()+50,o.y()+50),d(o.x()-50,o.y()+50){}
无效图形::paintEvent(QPaintEvent*e){
多晶硅;
poly您希望您的绘图
小部件有哪些行为?
默认情况下,它将根据布局自由调整大小,您可以使用和进行更改。您将在中找到详细信息。在看过OP的快照后,我考虑了可能发生的情况
OP的布局看起来没有那么错。
我仍然认为,布局在老年退休金计划问题上只起了很小的作用
我试着用我的一个更小的来重现OPs问题
MytestQGridLayout
:
#include <QtWidgets>
class Drawing: public QFrame {
public:
Drawing(QWidget *pQParent = nullptr);
virtual ~Drawing() = default;
Drawing(const Drawing&) = delete;
Drawing& operator=(const Drawing&) = delete;
protected:
virtual void paintEvent(QPaintEvent *pQEvent) override;
};
Drawing::Drawing(QWidget* pQParent):
QFrame(pQParent)
{
setFrameStyle(Box | Plain);
}
void Drawing::paintEvent(QPaintEvent* pQEvent)
{
{ QPainter qPainter(this);
qPainter.drawText(QPoint(40, 40),
QString("Size: %1 x %2").arg(width()).arg(height()));
qPainter.setPen(Qt::red);
qPainter.drawRect(300, 100, 200, 200);
}
// call base class paint event to keep it working
QFrame::paintEvent(pQEvent);
}
class MainWindow: public QWidget {
public:
MainWindow(QWidget *pQParent = nullptr);
virtual ~MainWindow() = default;
MainWindow(const MainWindow&) = delete;
MainWindow& operator=(const MainWindow&) = delete;
private:
QGridLayout _qGrid;
Drawing _qDrawing;
QSlider _qSliderT;
QSlider _qSliderR;
};
MainWindow::MainWindow(QWidget *pQParent):
QWidget(pQParent),
_qSliderT(Qt::Horizontal),
_qSliderR(Qt::Horizontal)
{
resize(840, 620);
_qGrid.addWidget(&_qDrawing, 0, 0);
_qGrid.addWidget(new QLabel("Translation Horizontal"), 1, 0);
_qSliderT.setRange(150, 650);
_qSliderT.setSliderPosition(400);
_qGrid.addWidget(&_qSliderT, 2, 0);
_qGrid.addWidget(new QLabel("Rotation"), 1, 1);
_qSliderR.setSliderPosition(50);
_qGrid.addWidget(&_qSliderR, 2, 1);
setLayout(&_qGrid);
}
int main(int argc, char **argv)
{
qDebug() << "Qt Version:" << QT_VERSION_STR;
QApplication app(argc, argv);
// setup GUI
MainWindow qWinMain;
qWinMain.setWindowTitle("Test QGridLayout");
qWinMain.show();
// runtime loop
return app.exec();
}
我做了一些修改,排除了哪些是可能的问题,哪些不是
我从导出了我的绘图
。因此,很容易给它一个可见的边框。正如预期的那样,我的绘图_qDrawing
只占用第一个滑块上方的空间(QSlider _qSliderT;
)
我将小部件大小的输出添加到绘图::paintEvent()
以查看其大小。然后我添加了一个红色矩形的绘图。为此,我希望覆盖一个部分位于小部件内部,部分位于小部件下方和右侧的空间
这就是我的结论:
正如OPs代码中公开的那样,布局应该是相同的
OPs矩形始终在相同的坐标处绘制。因此,在绘图
足够大(使用主窗口)之前,它不可见
QPainter
(即QPoint(0,0)
)的原点是小部件的左上角。这可以通过应用转换来更改,但在OPs代码中我看不到。(滑块的效果,我现在忽略了。)
尽管如此,仍有一些事情我不清楚:
绘图
应该剪辑绘画。因此,我想知道OPs矩形如何出现在旋转滑块上。或者,OP为绘图m_dessin
使用了一个跨距,或者小部件没有在OP使用的绘画引擎上剪辑绘画。(外观与我的完全不同。因此,它可能是一个不同的平台。)
在OPs快照中可以看到的布局与公开的代码不匹配。在OPs快照中,绘图
占据了主窗口增长所产生的所有额外空间。这只有在使用/时才可能(如我在第一条评论中所建议的)。但是,公开的代码不包含它们
为了验证这一点,我更改了MainWindow::MainWindow()
中的布局:
输出:
现在,布局似乎与OPs快照中的一个相匹配
正在尝试调整大小:
这看起来正是它应该做到的:
绘图_qDrawing
随着主窗口的大小而收缩和增长
- 如果
绘图_qDrawing
的尺寸太小而无法覆盖,则会剪裁该画
最终结论:
OPs布局没有问题
IMHO,OP还不完全清楚坐标系在QPainter
中的应用
为此,我可以热情推荐一个额外的Qt online文档页,专门用于此主题:
MainWindow::MainWindow(QWidget *pQParent):
QWidget(pQParent),
_qSliderT(Qt::Horizontal),
_qSliderR(Qt::Horizontal)
{
resize(840, 620);
_qGrid.setRowStretch(0, 1);
_qGrid.setColumnStretch(0, 1);
_qGrid.addWidget(&_qDrawing, 0, 0, 1, 2);
_qGrid.addWidget(new QLabel("Translation Horizontal"), 1, 0);
_qSliderT.setRange(150, 650);
_qSliderT.setSliderPosition(400);
_qGrid.addWidget(&_qSliderT, 2, 0);
_qGrid.addWidget(new QLabel("Rotation"), 1, 1);
_qSliderR.setSliderPosition(50);
_qGrid.addWidget(&_qSliderR, 2, 1);
setLayout(&_qGrid);
}
class MainWindow: public QWidget {
public:
MainWindow(QWidget *pQParent = nullptr);
virtual ~MainWindow() = default;
MainWindow(const MainWindow&) = delete;
MainWindow& operator=(const MainWindow&) = delete;
private:
QGridLayout _qGrid;
Drawing _qDrawing;
QSlider _qSliderV;
QSlider _qSliderT;
QSlider _qSliderR;
};
MainWindow::MainWindow(QWidget *pQParent):
QWidget(pQParent),
_qSliderV(Qt::Vertical),
_qSliderT(Qt::Horizontal),
_qSliderR(Qt::Horizontal)
{
resize(840, 620);
_qGrid.setRowStretch(0, 1);
_qGrid.setColumnStretch(0, 1);
_qGrid.addWidget(&_qDrawing, 0, 0, 1, 2);
_qGrid.addWidget(&_qSliderV, 0, 2);
_qGrid.addWidget(new QLabel("Translation Horizontal"), 1, 0);
_qSliderT.setRange(150, 650);
_qSliderT.setSliderPosition(400);
_qGrid.addWidget(&_qSliderT, 2, 0);
_qGrid.addWidget(new QLabel("Rotation"), 1, 1, 1, 2);
_qSliderR.setSliderPosition(50);
_qGrid.addWidget(&_qSliderR, 2, 1, 1, 2);
setLayout(&_qGrid);
}