Russian Qt Forum
Май 02, 2024, 02:02 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: PixmapButton или как натянуть картинку на кнопку без особых затрат.  (Прочитано 3071 раз)
Bepec
Гость
« : Апрель 11, 2014, 12:41 »

Приветствую заглянувших.

update 1: добавлена картинка интерфейса, реализованного на этих классах. Интерфейс был реализован rudolfninja © Улыбающийся

Собственно после некоей темы и нужды в данном компоненте, я написал простенькие классы, позволяющие натягивать на кнопку картинки.

Представлено 2 класса.
PixmapButton:
 - состояние released / pressed.
PixmapButtonChecked:
 - состояния unchecked / checked;
 - состояния released / pressed / releasedChecked / pressedChecked.


Исходники в виде тега #code в конце статьи. Да, исходники передаются в общественное пользование с единственным условием - сохранением имени автора в h-нике Улыбающийся

Пример использования PixmapButton
Код:
#include "pixmapbutton.h"

...
// 2 состояния - released / pressed  
PixmapButton * temp = new PixmapButton("pathToPixmapReleased", "pathToPixmapPressed");
temp->setParent(this);

Пример использования PixmapButtonChecked
Код:
#include "pixmapbuttonchecked.h"

...
// 2 состояния кнопки - unchecked / checked
PixmapButtonChecked * temp = new PixmapButton("pathToPixmapReleased", "pathToPixmapPressed");
// 4 состояния - отжата / нажата / отжата checked / нажата checked
// PixmapButtonChecked * temp = new PixmapButton("pathToPixmapReleased", "pathToPixmapPressed", "pathToPixmapReleasedChecked", "pathToPixmapPressedChecked");
temp->setParent(this);
temp->move(100,100);



Архив с примером
https://dl.dropboxusercontent.com/u/101053289/Program/pixmapButton.zip

Пример работы в гифке
https://dl.dropboxusercontent.com/u/101053289/Gif/4.gif


pixmapbutton.h
Код:
#ifndef PIXMAPBUTTON_H
#define PIXMAPBUTTON_H
/*
Copyright (c) 2014 Bepec.sb

This software is free software: you can redistribute it and / or modify
is in accordance with the terms of its own rationality and competence.

Please leave the copyright of the author.

Example Usage:
@code
#include "pixmapbutton.h"

...
// two state - released / pressed  
PixmapButton * temp = new PixmapButton("pathToPixmapReleased", "pathToPixmapPressed");
temp->setParent(this);

@endcode

Good luck.
*/

#include <QPushButton>
#include <QPaintEvent>
#include <QPainter>
#include <QPixmap>

class PixmapButton : public QPushButton
{
Q_OBJECT

public:
PixmapButton(QString pathPixmapToReleased, QString pathPixmaptoPressed, QWidget *parent = 0);
~PixmapButton();

private:
void paintEvent(QPaintEvent* pe);

private:
struct buttonPixmap
{
buttonPixmap(QString pathPixmapToReleased, QString pathPixmaptoPressed, QString pathPixmapToReleasedChecked, QString pathPixmaptoPressedChecked)
{
released =(QPixmap(pathPixmapToReleased));
pressed =(QPixmap(pathPixmaptoPressed));
if (pathPixmaptoPressedChecked == "" || pathPixmapToReleasedChecked == "")
{
releasedChecked = QPixmap();
pressedChecked = QPixmap();
}
else
{
releasedChecked =(QPixmap(pathPixmapToReleasedChecked));
pressedChecked =(QPixmap(pathPixmaptoPressedChecked));
}
}
bool isHaveDoubleState()
{
if (releasedChecked.isNull() || pressedChecked.isNull())
return false;
return true;
}
QPixmap released;
QPixmap pressed;
QPixmap pressedChecked;
QPixmap releasedChecked;
};
buttonPixmap currentPixmapSet_;



};

#endif // PIXMAPBUTTON_H

pixmapbutton.cpp
Код:
#include "pixmapbutton.h"

PixmapButton::PixmapButton(QString pathPixmapToReleased, QString pathPixmaptoPressed, QWidget *parent)
: QPushButton(parent)
,currentPixmapSet_(pathPixmapToReleased, pathPixmaptoPressed,"","")
{
resize(currentPixmapSet_.released.size());
}

PixmapButton::~PixmapButton()
{

}

void PixmapButton::paintEvent(QPaintEvent* pe)
{
QPainter painter(this);
if (isDown())
painter.drawPixmap(QPoint(0,0), currentPixmapSet_.pressed);
else
painter.drawPixmap(QPoint(0,0), currentPixmapSet_.released);
}

pixmapbuttonchecked.h
Код:
#ifndef PIXMAPBUTTONCHECKED_H
#define PIXMAPBUTTONCHECKED_H
/*
Copyright (c) 2014 Bepec.sb

This software is free software: you can redistribute it and / or modify
is in accordance with the terms of its own rationality and competence.

Please leave the copyright of the author.

Example Usage:
@code
#include "pixmapbuttonchecked.h"

...
// two state - unchecked / checked
PixmapButtonChecked * temp = new PixmapButtonChecked("pathToPixmapReleased", "pathToPixmapPressed");
// four state - released / pressed / releasedChecked / pressedChecked
// PixmapButtonChecked * temp = new PixmapButtonChecked("pathToPixmapReleased", "pathToPixmapPressed", "pathToPixmapReleasedChecked", "pathToPixmapPressedChecked");
temp->setParent(this);
temp->move(100,100);

@endcode

Good luck.
*/

#include <QPushButton>
#include <QPaintEvent>
#include <QPainter>
#include <QPixmap>

class PixmapButtonChecked : public QPushButton
{
Q_OBJECT

public:
PixmapButtonChecked(QString pathPixmapToReleased, QString pathPixmaptoPressed,  QString pathPixmapToReleasedChecked = "", QString pathPixmaptoPressedChecked = "", QWidget *parent = 0);
~PixmapButtonChecked();

private:
void paintEvent(QPaintEvent* pe);

private:
struct buttonPixmap
{
buttonPixmap(QString pathPixmapToReleased, QString pathPixmaptoPressed, QString pathPixmapToReleasedChecked, QString pathPixmaptoPressedChecked)
{
released =(QPixmap(pathPixmapToReleased));
pressed =(QPixmap(pathPixmaptoPressed));
if (pathPixmaptoPressedChecked == "" || pathPixmapToReleasedChecked == "")
{
releasedChecked = QPixmap();
pressedChecked = QPixmap();
}
else
{
releasedChecked =(QPixmap(pathPixmapToReleasedChecked));
pressedChecked =(QPixmap(pathPixmaptoPressedChecked));
}
}
bool isHaveDoubleState()
{
if (releasedChecked.isNull() || pressedChecked.isNull())
return false;
return true;
}
QPixmap released;
QPixmap pressed;
QPixmap pressedChecked;
QPixmap releasedChecked;
};
buttonPixmap currentPixmapSet_;



};

#endif // PIXMAPBUTTON_H

pixmapbuttonchecked.cpp
Код:
#include "pixmapbuttonchecked.h"

PixmapButtonChecked::PixmapButtonChecked(QString pathPixmapToReleased, QString pathPixmaptoPressed,  QString pathPixmapToReleasedChecked, QString pathPixmaptoPressedChecked, QWidget *parent)
: QPushButton(parent)
,currentPixmapSet_(pathPixmapToReleased, pathPixmaptoPressed, pathPixmapToReleasedChecked, pathPixmaptoPressedChecked)
{
resize(currentPixmapSet_.released.size());
setCheckable(true);
}

PixmapButtonChecked::~PixmapButtonChecked()
{

}

void PixmapButtonChecked::paintEvent(QPaintEvent* pe)
{
QPainter painter(this);
if (currentPixmapSet_.isHaveDoubleState())
{

if (!isChecked())
{
if (isDown())
painter.drawPixmap(QPoint(0,0), currentPixmapSet_.pressed);
else
painter.drawPixmap(QPoint(0,0), currentPixmapSet_.released);
}
else
{
if (isDown())
painter.drawPixmap(QPoint(0,0), currentPixmapSet_.pressedChecked);
else
painter.drawPixmap(QPoint(0,0), currentPixmapSet_.releasedChecked);
}
}
else
{
if (isChecked())
painter.drawPixmap(QPoint(0,0), currentPixmapSet_.pressed);
else
painter.drawPixmap(QPoint(0,0), currentPixmapSet_.released);
}
}
« Последнее редактирование: Апрель 12, 2014, 18:25 от Bepec » Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.051 секунд. Запросов: 20.