Qt 4.8.4 MSVC++10 Express: Button knubbels (sizer)

jkallup

Erfahrenes Mitglied
Hallo,

habe folgenden Code:
wie kann ich das flakkern weg bekommen und wie muss der Algo aussehen, um den Button in seiner Größe zu ändern?
den unteren linken knubbel habe ich keine Probleme, aber mit den restlichen ...

Für Hilfe bin ich sehr dankbar
Code:
#include <QApplication>
#include <QPushButton>
#include <QPainter>
#include <QMouseEvent>
#include <QWidget>

QWidget *designer = NULL;

class TMyButton : public QPushButton
{
public:
	TMyButton(QWidget *parent) : QPushButton(parent)
	{
		setMouseTracking(true);
		FMouseDown = false;
	};

private:
	bool FMouseDown;
	int  FDownMode;

	QRect leftUp;
    QRect leftDown;
    QRect rightUp;
    QRect rightDown;

	int oldX;
	int oldY;

protected:
	virtual void paintEvent(QPaintEvent *event)
	{
		QPushButton::paintEvent(event);

		leftUp = QRect(0,0,4,4);
        leftDown = QRect(0,height()-4,4,4);
        rightUp = QRect(width()-4,0,4,4);
        rightDown = QRect(width()-4,height()-4,4,4);

		QPainter painter(this);
		QBrush b(QColor(0,0,0));

		painter.fillRect(0,0,4,4,b);
		painter.fillRect(0,height()-4,4,4,b);
		painter.fillRect(width()-4,0,4,4,b);
		painter.fillRect(width()-4,height()-4,4,4,b);
	}

	virtual void mousePressEvent(QMouseEvent *event)
	{
		FMouseDown = true;

		oldX = x();
		oldY = y();
	}

	virtual void mouseReleaseEvent(QMouseEvent *event)
	{
		FMouseDown = false;
		FDownMode = false;
	}

	virtual void mouseMoveEvent(QMouseEvent *event)
	{
		int x = event->pos().x();
		int y = event->pos().y();

		if (leftUp.contains(x, y))
		{
			FDownMode = 1;
			setCursor(Qt::SizeFDiagCursor);
		}
		else if (leftDown.contains(x, y))
		{
			FDownMode = 4;
			setCursor(Qt::SizeBDiagCursor);
		}
		else if (rightUp.contains(x, y))
		{
			FDownMode = 2;
			setCursor(Qt::SizeBDiagCursor);
		}
		else if (rightDown.contains(x, y))
		{
			FDownMode = 3;
			setCursor(Qt::SizeFDiagCursor);
		} else {
			if (!FMouseDown)
			{
				FDownMode = 0;
				setCursor(Qt::ArrowCursor);
			}
		}

		if (FMouseDown)
		{
			if (FDownMode == 3)
			resize(x,y);
			else if (FDownMode == 4)
			{
				resize(oldX-x,height());
				move(x,oldY);
			}
		}
	}
};

TMyButton *Pusher;

int main(int argc, char **argv)
{
	QApplication app(argc,argv);

	designer = new QWidget;
	designer->show();

	Pusher = new TMyButton(designer);
	Pusher->resize(50,30);
	Pusher->move(100,100);
	Pusher->show();

	return app.exec();
}
 
Eventuell solltest du nicht von QPushButton sondern direkt von QWidget ableiten.

Desweiteren willst du die Größe von dem Fenster oder von deinem Button ändern?
 
Konnte es jetzt testen und versteh wie du es haben willst, weiß aber nicht so recht was du mit dem flackern meinst.

Hab den move-methode ein wenig umgeschrieben sodass man den Button mit allen "greifern" verändern kann:
Code:
virtual void mouseMoveEvent(QMouseEvent *event)
    {
        int x = event->pos().x();
        int y = event->pos().y();
 
		if (!FMouseDown)
		{
			if (leftUp.contains(x, y))
			{
				FDownMode = 1;
				setCursor(Qt::SizeFDiagCursor);
			}
			else if (leftDown.contains(x, y))
			{
				FDownMode = 4;
				setCursor(Qt::SizeBDiagCursor);
			}
			else if (rightUp.contains(x, y))
			{
				FDownMode = 2;
				setCursor(Qt::SizeBDiagCursor);
			}
			else if (rightDown.contains(x, y))
			{
				FDownMode = 3;
				setCursor(Qt::SizeFDiagCursor);
			} else { 
			   FDownMode = 0;
			   setCursor(Qt::ArrowCursor);
			}
		}
		else
        {
			QRect newRect = geometry();

			if ((FDownMode == 1) || (FDownMode == 4))
				newRect.setLeft(newRect.left()+x);

			if ((FDownMode == 1) || (FDownMode == 2))
				newRect.setTop(newRect.top()+y);

			if ((FDownMode == 3) || (FDownMode == 2))
				newRect.setWidth(x);

			if ((FDownMode == 3) || (FDownMode == 4))
				newRect.setHeight(y);

			setGeometry(newRect);
        }
    }
 
Zurück