Unsolved drawEllipse() draws too many
-
Hi,
I have QScrollArea and QWidget in this area. That QWidget has QGridLayout and in this grid I have many QButtons in the first column ( I use only this one column, so I can use Vertical Layout rather than QGridLayout ). Now I would like to draw Circles on this QWidget. So in this QWidget I have paintEvent() function like this:
firstButtonPositionY=buttons.first()->geometry().y()+buttons.first()->height()/2; lastButtonPositionY = buttons.last()->geometry().y()+buttons.last()->height()/2;
I get proper values.
Next I do:
while( firstButtonPositionY < lastButtonPositionY ) { firstButtonPositionY+=100; painter.drawEllipse(QPointF(width()/2, firstButtonPositionY) , 5, 5); }
I get too many circles:
I would like to have only green circles, but I get that red circles too ( in the picture I draw 2 rects: the first and the last buttons ).
When I change drawElippse to drawRect() or drawPoint() I get what I want.
painter.drawRect(width()/2-5, firstButtonPositionY , 10, 30); or painter.drawPoint(width()/2,firstButtonPositionY);
I get rects / points only between buttons, not after last Button or before the first Button.
So what I do wrong with this drawEllipse()?
EDIT: that problem is when I have many QButtons ( 500+ ).
EDIT2: The problem is when QWidget has height = 65640. For height = 65490 everything is ok. Pow(2,16) = 65536, so this is very strange.
EDIT3: When I change my code to:
while( firstButtonPositionY < 100 ) // lastButtonPositionY is for example 300000 { firstButtonPositionY+=1; painter.drawEllipse(QPointF(width()/2, firstButtonPositionY) , 5, 5); }
I get 100 long lines in 5 different places. So it looks like my QWidget is end on 2^16 height and started next. Next Widget started on 2 * 2^16, next 3* 2^16, next 4* 2^16.
EDIT 4
Please check that code:
mainWindow.h:
#ifndef MAINWINDOW_H #define MAINWINDOW_H #include <QMainWindow> #include <QScrollArea> #include "mywidget.h" #include <QGridLayout> QT_BEGIN_NAMESPACE namespace Ui { class MainWindow; } QT_END_NAMESPACE class MainWindow : public QMainWindow { Q_OBJECT public: MainWindow(QWidget *parent = nullptr); ~MainWindow(); private: Ui::MainWindow *ui; QScrollArea *area; myWidget *widget; QGridLayout *grid; }; #endif // MAINWINDOW_H
mainWindow.cpp
#include "mainwindow.h" #include "ui_mainwindow.h" MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent) , ui(new Ui::MainWindow) { ui->setupUi(this); area = new QScrollArea; widget = new myWidget; grid = new QGridLayout; centralWidget()->setLayout(grid); grid->addWidget(area); area->setWidget(widget); } MainWindow::~MainWindow() { delete ui; }
myWidget.h
#ifndef MYWIDGET_H #define MYWIDGET_H #include <QWidget> #include <QPaintEvent> #include <QPushButton> #include <QGridLayout> class myWidget: public QWidget { Q_OBJECT void paintEvent(QPaintEvent *event); QGridLayout *grid; QVector <QPushButton *> buttons; public: myWidget(QWidget *parent = nullptr); }; #endif // MYWIDGET_H
myWidget.cpp
#include "mywidget.h" #include <QPainter> myWidget::myWidget(QWidget *parent): QWidget(parent) { grid = new QGridLayout; setLayout(grid); for(int i=0;i<1000;i++) { buttons.append(new QPushButton); buttons.last()->setFixedSize(50,50); grid->addWidget(buttons.last(),i,0); } grid->setSpacing(100); resize(minimumSizeHint()); } void myWidget::paintEvent(QPaintEvent *event) { QPainter painter(this); int begin = buttons.first()->y()+ buttons.first()->height(); int xButtons = buttons.first()->x()+buttons.first()->width()/2; for(int i=begin; i<300;i++) { painter.drawEllipse(QPointF(xButtons, i),1,1); } QWidget::paintEvent(event); }
And pictures:
I would like to draw a few circles only at the beginning of myWidget
for(int i=begin; i<300;i++) { painter.drawEllipse(QPointF(xButtons, i),1,1); }
But there are circles in 3 places ( look at the picture with red and green circles ).
-
I add the fourth EDIT - I think the most important