如何在Qt应用程序中编辑默认窗口标题和框架?

时间:2011-08-19 07:38:07

标签: c++ qt

我想用我的Qt应用程序创建一个个性化的UI。出于这个原因,我想编辑您可以在任何类型的窗口应用程序中看到的默认窗口框架。

包含默认窗口标题和框架的应用程序: http://0000.2.img98.net/out.php/i12977_with-default-title-and-frame.jpg

编辑窗口标题和框架的应用程序: http://0000.2.img98.net/out.php/i12978_without-defualt-title-andframe.jpg

1 个答案:

答案 0 :(得分:4)

您需要创建一个派生自QWidget的新类,并将Qt::FramelessWindowHint参数传递给QWidget构造函数,如下所示:

class MyWidget : public QWidget {
public:
MyWidget(QWidget* parent) : QWidget(parent, Qt::FramelessWindowHint) {...}

之后你需要重新实现QWidget::paintEvent (QPaintEvent * event)并绘制你想要的任何设计。

例如,您将主窗口设计为 PNG 图像。

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);
        setLayout(l);

        resize (500, 500);

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

        pixmap = QPixmap("./1.png"); // load design picture
};

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

由于我们没有看到标题栏,我们需要实现窗口拖动操作:

private:
    bool pressed;
    QPoint mousePressPoint;

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

    virtual void mouseMoveEvent ( QMouseEvent * event ) {
        QWidget::mouseMoveEvent(event);
        if (pressed) {move(event->globalPos() - mousePressPoint);}
    }

    virtual void mouseReleaseEvent ( QMouseEvent * event ) {
        QWidget::mouseReleaseEvent(event);
        if (pressed) {pressed = false;}
    }