Подклассифицированный QWidget не перемещается правильно

Я подклассифицировал QWidget следующим образом:

class myClass : public QWidget
{
public:
 explicit myClass(QWidget *parent);
protected:
 void paintEvent(QPaintEvent *event);
}

myWidget::myWidget(QWidget* parent) : QWidget(parent)
{
 setGeometry(10,10,100,100);
}

void myWidget::paintEvent(QPaintEvent *event)
{
 QPainter qp(this);
 QBrush bBlue(QColor::blue);
 qp.fillRect(geometry(), bBlue);
}

Я хотел создать синий QWidget, размещенный на родительском QWidget в 10,10 размера 100 100.

То, что я получаю, является размером по умолчанию для myWidget примерно 100,50 в 0,0 с черным фоном (или прозрачным) и синим прямоугольником, начиная с 10,10 в myWidget и обрезанным myWidget.

Он как setGeometry перемещал прямоугольник внутри myWidget, а не сам myWidget.

Довольно новый для Qt и хотел бы объяснить объяснение и исправить выше...

Заранее спасибо.

Гэри.

... вот фактический код:

это myWidget

class piTemplateWidget : public QWidget
{

public:
 explicit piTemplateWidget(QWidget* parent);

 static QColor* white;
 static QColor* black;
 static QColor* lightGrey;
 static QColor* lightGreen;

 piTemplate* tplt;

protected:
 void paintEvent(QPaintEvent *event);
};


QColor* piTemplateWidget::white = new QColor(15,15,15);
QColor* piTemplateWidget::black = new QColor(250,250,250);
QColor* piTemplateWidget::lightGrey = new QColor(100,100,100);
QColor* piTemplateWidget::lightGreen = new QColor(250,15,250);

piTemplateWidget::piTemplateWidget(QWidget* parent) : QWidget(parent)
{
 tplt = NULL;
 move(100,100);
 resize(300,240);
}

void piTemplateWidget::paintEvent(QPaintEvent *event)
{
 QPainter qp(this);

 QBrush bWhite(*white);

 qp.fillRect(this->geometry(), bWhite);

// if (tplt==NULL)
// return;

// tplt->render(&qp);

}

... и это конструктор родительских виджетов, который создает экземпляр моего виджета

piTemplateEdit::piTemplateEdit(QWidget *parent) :
 QWidget(parent),
 ui(new Ui::piTemplateEdit)
{
 ui->setupUi(this);

 currentTemplate = NULL;
 if (piTemplate::templates->count()>0)
 {
 currentTemplate = (piTemplate*)piTemplate::templates->atIndex(0);
 }
 templateWidget = new piTemplateWidget(this);
 templateWidget->tplt = currentTemplate;
}

... Я надеюсь, что это поможет.

Спасибо.

1 ответ

Установка geometry во время конструктора может быть переопределена событием show которое на него вызывает родительский виджет.

Общая основная функция может выглядеть так:

#include <qtgui qapplication="">
#include "mainwindow.h"

int main(int argc, char *argv[])
{
 QApplication a(argc, argv);
 MainWindow w;
 w.show();
 // w.showMaxmized(); // This line would trump the "setGeometry() call 
 // in the constructor

 return a.exec();
}
</qtgui>

Элемент геометрии, сохраненный в QWidget, описан здесь:

http://qt-project.org/doc/qt-4.8/application-windows.html

http://qt-project.org/doc/qt-4.8/qwidget.html#pos-prop

Я бы не использовал этот внутренний параметр QWidget как ваш виджет. Если вы хотите сохранить некоторые настройки, сделайте QRect члена QRect и используйте это вместо этого.

Если вы хотите заполнить всю коробку вашего QWidget цветом, вы должны попробовать что-то вроде этого:

void myWidget::paintEvent(QPaintEvent *event)
{
 QPainter qp(this);
 QBrush bBlue(QColor::blue);
 qp.fillRect(QRect(0,0, this->width(), this->height()), bBlue);
}

Внутри функций краски, они относятся к области, в которой вы находитесь.

http://qt-project.org/doc/qt-4.8/qwidget.html#mapTo

И как @LaszloPapp говорил, вам нужно использовать resize() и move(). И это не помешает вызвать вызов update() после одного из них.

Также не забудьте проверить метод show() и все его элементы "См. Также".

http://qt-project.org/doc/qt-4.8/qwidget.html#show

http://qt-project.org/doc/qt-4.8/qshowevent.html

Если вы #include и вызываете resize() когда происходит событие show, возможно, вам будет хорошо. Если вы размещаете этот виджет внутри другого виджета, вы должны изучить его с помощью подсказки размера и setFixedSize или правильно использовать макеты.

http://qt-project.org/doc/qt-4.8/layout.html

Надеюсь, это поможет.

licensed under cc by-sa 3.0 with attribution.