Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/qt/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Qt5:显示带有布局的QPaint_Qt_Layout_Qt5_Qpainter - Fatal编程技术网

Qt5:显示带有布局的QPaint

Qt5:显示带有布局的QPaint,qt,layout,qt5,qpainter,Qt,Layout,Qt5,Qpainter,我不久前开始使用Qt5,但我不知道如何设置绘图在窗口中的位置 我有一个Drawing类,它是一个QWidget,包含我的paintEvent()函数和其他函数;以及一个包含一些小部件的主窗口类。因此,为了显示我的QPaint,我必须将其包含在我的布局中,这是主窗口布局,但窗口根本不适应QPaint;按钮、滑块的尺寸。。调整以组织自己并占据我窗口的所有空间,但他们完全忽略我的Qpainter,如果我放置至少2个小部件,它就会部分消失 您是否有更好地管理这些要素位置的解决方案 main.cpp: #

我不久前开始使用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问题

My
testQGridLayout

#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);
    }