Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/qt/6.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
Qt 子类QWidget无法正确移动_Qt - Fatal编程技术网

Qt 子类QWidget无法正确移动

Qt 子类QWidget无法正确移动,qt,Qt,我将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 myWidg

我将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,大小为100100

我得到的是myWidget的默认大小,大约为100,50,0,0,黑色背景或透明,蓝色矩形从myWidget内的10,10开始,由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;
}
…我希望这能有所帮助

谢谢。

在构造函数期间设置几何体可能会被父窗口小部件调用的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();
}
void myWidget::paintEvent(QPaintEvent *event)
{
   QPainter qp(this);
   QBrush bBlue(QColor::blue);
   qp.fillRect(QRect(0,0, this->width(), this->height()), bBlue);
}
在绘制函数中,它们相对于您所在的可绘制区域

正如@LaszloPapp所说,您需要使用resize和move。在其中任何一个之后再打一个更新电话都没有坏处

还要确保签出show方法及其所有See-allow项

如果您包括,并在展会活动发生时调用resize,则您可以继续。如果您将这个小部件嵌套在另一个小部件中,您应该考虑使用size提示和setFixedSize或正确使用布局


希望能有所帮助。

刚刚添加了实际代码……感谢您的帮助,希望您能看到下面的评论以及我的错误所在……嗨,phyatt。谢谢你的回答。我必须睡一会儿!最初的setGeometry10,10100100工作正常。是fillRect出错了。。。正如您所期望的,在这里传递的rect是相对于QWidget客户端区域的,因此应该位于0,0。这就是让我失望的原因。我想你回答了我的问题-非常感谢和干杯!