2013-09-10 3 views
0

я подклассы 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 и хотел бы объяснить и затруднительное положение выше ...

Спасибо заранее.

Gary.

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

это 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; 
} 

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

спасибо.

+0

только что добавил актуальный код ... –

+0

Спасибо за вашу помощь, надеюсь, вы можете увидеть комментарии ниже и где я ошибся ... –

ответ

0

Установка 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(); 
} 

геометрии прямоугольник, хранящийся в 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 и используйте это вместо этого.

Если вы хотите, чтобы заполнить весь ящик вашего 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 <QShowEvent> и вызвать resize(), когда происходит событие шоу, вы можете быть хорошо идти. Если вы размещаете этот виджет внутри другого виджета, вы должны изучить его с помощью подсказки размера и setFixedSize или с помощью макетов правильно.

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

Надежда, что помогает.

+0

Hi phyatt. Спасибо за Ваш ответ. Мне нужно немного поспать! Исходный набор геометрии (10,10,100,100) работает просто отлично. Это была ошибка fillRect ... по мере того, как вы стремились - прямоугольник, переданный в этом, был относительно клиентской области QWidget и поэтому должен быть расположен в 0,0. Это то, что меня бросило. Думаю, вы ответили на мой вопрос - большое спасибо и приветствия! –

Смежные вопросы