我已经将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父级上,大小为100,100的10,100。
我得到的是 myWidget 的默认大小,大约为 100,50 在 0,0,0,黑色背景(或透明)和一个蓝色矩形,从 myWidget 中的 10,10 开始,并由 myWidget 剪辑。
这就像setGeometry在myWidget中移动了一个矩形,而不是myWidget本身。
对Qt相当陌生,并希望对上述内容进行解释和修复...
提前谢谢你。
加里。
。这是实际代码:
这是我的小部件
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;
}
。我希望这有所帮助。
谢谢。
在构造函数期间设置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
希望有帮助。