Russian Qt Forum

Qt => Пользовательский интерфейс (GUI) => Тема начата: Rossongs от Март 20, 2012, 19:20



Название: Картинка в качестве окна
Отправлено: Rossongs от Март 20, 2012, 19:20
Здравствуйте! Подскажите как можно сделать картинку со скругленными углами в качестве окна.
Пробовал как в этом примере:
Код:
/* ======================================================================
**  main.cpp
** ======================================================================
**
** ======================================================================
**  Copyright (c) 2007 by Max Schlee
** ======================================================================
*/
 
#include <QtGui>
 
// ======================================================================
class Window : public QLabel {
private:
    QPoint  m_ptPosition;
 
protected:
    virtual void Window::mousePressEvent(QMouseEvent* pe)
    {
        m_ptPosition = pe->pos();
    }
 
    virtual void Window::mouseMoveEvent(QMouseEvent* pe)
    {
        move(pe->globalPos() - m_ptPosition);
    }
 
public:
    Window(QWidget* pwgt = 0)
        : QLabel(pwgt,  Qt::FramelessWindowHint | Qt::Window)
    {
    }
};
 
// ----------------------------------------------------------------------
int main(int argc, char** argv)
{
    QApplication app(argc, argv);
    Window       win;
    QPixmap      pix(":/images/unixoids.png");
 
    win.setPixmap(pix);
    win.setMask(pix.mask());
    win.show();
 
    return app.exec();
}

Но при компиляции выдается ошибка типо setMask не является членом...
Мой класс наследует только у QWidget, пробовал множественное наследование, не компилируется.
Пишу на студии + либы Qt
Помогите тупому плиз :)


Название: Re: Картинка в качестве окна
Отправлено: V1KT0P от Март 20, 2012, 20:13
Здравствуйте! Подскажите как можно сделать картинку со скругленными углами в качестве окна.
Пробовал как в этом примере:
Код
C++ (Qt)
class Window : public QLabel {
 

Но при компиляции выдается ошибка типо setMask не является членом...
Мой класс наследует только у QWidget, пробовал множественное наследование, не компилируется.
Пишу на студии + либы Qt
Помогите тупому плиз :)
Я думаю это не очень удачная идея делать окно из надписи.
Может все же попробуешь унаследовать Window от QWidget, он то для окна лучше подходит чем QLabel.


Название: Re: Картинка в качестве окна
Отправлено: Rossongs от Март 20, 2012, 20:28
Пробовал от QWidget наследовать, то же самое..
Вот, гляньте код


Код:
#include "qtgranitmainwindow.h"
#include <QtGui/QApplication>

int main(int argc, char *argv[])
{
QApplication a(argc, argv);
QtGranitMainWindow w;


QPixmap      pix("background.png");
 
    w.setPixmap(pix);
    w.setMask(pix.mask());


w.show();
return a.exec();
}


Код:

#ifndef QTGRANITMAINWINDOW_H
#define QTGRANITMAINWINDOW_H

#include <QtGui/QWidget>
#include "ui_qtgranitmainwindow.h"

class QtGranitMainWindow : public QWidget
{
Q_OBJECT

public:
QtGranitMainWindow(QWidget *parent = 0, Qt::WFlags flags = 0);
~QtGranitMainWindow();

private:
Ui::QtGranitMainWindowClass ui;
};

#endif // QTGRANITMAINWINDOW_H


Код:

#include "qtgranitmainwindow.h"

QtGranitMainWindow::QtGranitMainWindow(QWidget *parent, Qt::WFlags flags)
: QWidget(parent, flags)
{
setWindowFlags(Qt::FramelessWindowHint);
ui.setupUi(this);
}

QtGranitMainWindow::~QtGranitMainWindow()
{

}


Цитировать
1>main.cpp(12): error C2039: setPixmap: не является членом "QtGranitMainWindow"
1>          c:\visual studio 2010\qtgranitmainwindow\qtgranitmainwindow\qtgranitmainwindow.h(7): см. объявление "QtGranitMainWindow"
1>main.cpp(13): error C2027: использование неопределенного типа "QBitmap"
1>          c:\qt\4.8.0\include\qtgui\../../src/gui/kernel/qwindowdefs.h(77): см. объявление "QBitmap"


Название: Re: Картинка в качестве окна
Отправлено: V1KT0P от Март 20, 2012, 20:49
Пробовал от QWidget наследовать, то же самое..
Вот, гляньте код
Создал стандартный проект в конструкторе MainWindow дописал:
Код
C++ (Qt)
QPixmap pixmap("F:/tux.png");
QLabel *topLevelLabel = new QLabel(this);
ui->verticalLayout->addWidget(topLevelLabel);
topLevelLabel->setPixmap(pixmap);
this->setMask(pixmap.mask());
Получилось прекрасное окно, если так можно его назвать =). Интересно а можно ли не просто вырезать часть окна но и сделать прозрачным только часта окна?

Не забывай добавлять заголовочные файлы, которые тебя просит компилятор:
Код
C++ (Qt)
#include <QLabel>
#include <QBitmap>


Название: Re: Картинка в качестве окна
Отправлено: _OLEGator_ от Март 20, 2012, 21:34
полупрозрачное окно (прозрачность регулируется картинкой):
http://habrahabr.ru/qa/9235/


Название: Re: Картинка в качестве окна
Отправлено: V1KT0P от Март 20, 2012, 21:41
полупрозрачное окно (прозрачность регулируется картинкой):
http://habrahabr.ru/qa/9235/
Спасибо, действительно при добавлении:
Код
C++ (Qt)
   this->setAttribute(Qt::WA_TranslucentBackground);
   this->setWindowFlags(Qt::FramelessWindowHint);
Получается красивое окно с красивыми прозрачностями.


Название: Re: Картинка в качестве окна
Отправлено: Rossongs от Март 20, 2012, 21:43
Спасибо, работает, но углы не совсем скругленные, они обрезаются лесенкой. А можно ли подобного эффекта добится с помощью QSS?


Название: Re: Картинка в качестве окна
Отправлено: V1KT0P от Март 20, 2012, 21:59
Спасибо, работает, но углы не совсем скругленные, они обрезаются лесенкой. А можно ли подобного эффекта добится с помощью QSS?
А ты сделай углы полупрозрачными, в кодом который я привел выше. Без него полупрозрачные области тукса были непрозрачными и с лесенкой, а после добавления полупрозрачные области стали полупрозрачными и этим сгладили лесенку =).