Как я могу отредактировать заголовок и рамку окна по умолчанию в приложении Qt? - PullRequest
0 голосов
/ 19 августа 2011

Я хочу создать персонализированный пользовательский интерфейс с моим приложением Qt.По этой причине я хочу отредактировать оконную раму по умолчанию, которую можно увидеть в любом типе оконного приложения.

Приложение, которое содержит заголовок и рамку окна по умолчанию: 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 Ответ

4 голосов
/ 19 августа 2011

Вам необходимо создать новый класс, полученный из 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;}
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...