在Qt中编辑无框窗口

时间:2011-08-24 08:45:41

标签: c++ qt

我在Qt中创建了一个具有小部件和背景的无框窗口。但我在这种形式有一个问题,当我调整大小形式所有小部件调整好大小但背景不是 请参见此图片进行演示

未发生调整大小时:

http://0000.2.img98.net/out.php/i20624_no-resize.jpg

发生调整大小时

http://0000.2.img98.net/out.php/i20625_with-resize.jpg

这是我创建表单的代码:

#ifndef MYWIDGET_H
#define MYWIDGET_H

#include <QPushButton>
#include <QLabel>
#include <QComboBox>
#include <QPixmap>
#include <QVBoxLayout>
#include <QPainter>
#include <QMouseEvent>
#include <QtGui>
#include <QSizeGrip>


class MyWidget : public QWidget {
Q_OBJECT
private:
    QPushButton* button;
    QLabel* label;
    QComboBox* combobox;
    QPixmap pixmap;

public:
    explicit MyWidget(QWidget *parent = 0)  : QWidget(parent, Qt::FramelessWindowHint)
 {

        // Create some controls
        button = new QPushButton();
        label = new QLabel();
        combobox = new QComboBox();


        QVBoxLayout* l = new QVBoxLayout();

        l->addWidget(button);
        l->addWidget(label);
        l->addWidget(combobox);


        QSizeGrip *grip = new QSizeGrip(parent);

        l->addWidget(grip, 0, Qt::AlignBottom | Qt::AlignRight);
         setLayout(l);


        resize (400, 500);

        setAttribute(Qt::WA_TranslucentBackground); // enable translucent background

                pixmap = QPixmap("./1.png");


}

protected:
    virtual void paintEvent (QPaintEvent* event) {
        QPainter painter(this);
         painter.setPen(Qt::NoPen);
         painter.setBrush(QColor(0, 0, 0, 0));
         QRect rec = pixmap.rect();
         painter.drawRect(this->rect());
         painter.drawPixmap(this->rect(), pixmap, rec);


}
private:
    bool pressed;
    QPoint mousePressPoint;

protected:
    virtual void mousePressEvent ( QMouseEvent * event ) {
        QWidget::mousePressEvent(event);
        if (!pressed) {
            pressed = true;
            mousePressPoint = event->pos();
        }
    }

 #endif // MYWIDGET_H

1 个答案:

答案 0 :(得分:1)

由于您的控件在窗口中居中但看起来不像它们,因此可能表示您用作背景的图像的非透明部分周围有透明边框。

您可以在paintEvent中删除画笔中的透明度以确认,例如:

painter.setBrush(QColor(0, 0, 0, 255));

更清楚,问题不在您的代码中,而是在图片中:使用编辑器打开图像,只选择不透明的部分,只使用该部分保留该部分“裁剪工具”,最后保存图像。