Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- // Dolaczamy plik naglowkowy naszej klasy MyWindow
- #include "mywindow.h"
- // Dolaczamy plik naglowkowy zawierajacy definicje GUI
- // Plik ten jest generowany automatycznie
- // z pliku XML "mywindow.ui"
- #include "ui_mywindow.h"
- // Definicja konstruktora, wywolujemy najpierw
- // konstruktor klasy nadrzednej, nastepnie tworzymy
- // obiekt klasy Ui_MyWindow reprezentujacy GUI
- MyWindow::MyWindow(QWidget *parent) :
- QMainWindow(parent),
- ui(new Ui::MyWindow)
- {
- // Wywolujemy funkcje tworzaca elementy GUI
- // Jej definicja znajduje sie w pliku "ui_mywindow.h"
- ui->setupUi(this);
- // Pobieramy wymiary i wspolrzedne lewego gornego naroznika ramki
- // i ustawiamy wartosci odpowiednich pol
- // Uwaga: ramke "rysujFrame" wykorzystujemy tylko do
- // wygodnego ustaiwenia tych wymiarow. Rysunek bedziemy wyswietlac
- // bezposrednio w glownym oknie aplikacji.
- szer = ui->rysujFrame->width();
- wys = ui->rysujFrame->height();
- poczX = ui->rysujFrame->x();
- poczY = ui->rysujFrame->y();
- // Tworzymy obiekt klasy QImage, o odpowiedniej szerokosci
- // i wysokosci. Ustawiamy format bitmapy na 32 bitowe RGB
- // (0xffRRGGBB).
- img = new QImage(szer,wys,QImage::Format_RGB32);
- }
- // Definicja destruktora
- MyWindow::~MyWindow()
- {
- delete ui;
- }
- // Funkcja (slot) wywolywana po nacisnieciu przycisku "Wyjscie" (exitButton)
- // Uwaga: polaczenie tej funkcji z sygnalem "clicked"
- // emitowanym przez przycisk jest realizowane
- // za pomoca funkcji QMetaObject::connectSlotsByName(MyWindow)
- // znajdujacej sie w automatycznie generowanym pliku "ui_mywindow.h"
- // Nie musimy wiec sami wywolywac funkcji "connect"
- void MyWindow::on_exitButton_clicked()
- {
- // qApp to globalny wskaznik do obiektu reprezentujacego aplikacje
- // quit() to funkcja (slot) powodujaca zakonczenie aplikacji z kodem 0 (brak bledu)
- qApp->quit();
- }
- // Funkcja "odmalowujaca" komponent
- void MyWindow::paintEvent(QPaintEvent*)
- {
- // Obiekt klasy QPainter pozwala nam rysowac na komponentach
- QPainter p(this);
- // Rysuje obrazek "img" w punkcie (poczX,poczY)
- // (tu bedzie lewy gorny naroznik)
- p.drawImage(poczX,poczY,*img);
- }
- // Funkcja (slot) wywolywana po nacisnieciu przycisku "Czysc" (cleanButton)
- void MyWindow::on_cleanButton_clicked()
- {
- // Funkcja czysci (zamalowuje na bialo) obszar rysowania
- // definicja znajduje sie ponizej
- czysc();
- // Funkcja "update()" powoduje ponowne "namalowanie" calego komponentu
- // Wywoluje funkcje "paintEvent"
- update();
- }
- // Funkcja (slot) wywolywana po nacisnieciu przycisku "Rysuj 1" (draw1Button)
- void MyWindow::on_draw1Button_clicked()
- {
- rysuj1();
- update();
- }
- // Funkcja (slot) wywolywana po nacisnieciu przycisku "Rysuj 2" (draw2Button)
- void MyWindow::on_draw2Button_clicked()
- {
- rysuj2();
- update();
- }
- // Funkcja powoduje wyczyszczenie (zamalowanie na bialo)
- // obszaru rysowania
- void MyWindow::czysc()
- {
- // Wskaznik za pomoca, ktorego bedziemy modyfikowac obraz
- unsigned char *ptr;
- // Funkcja "bits()" zwraca wskaznik do pierwszego piksela danych
- ptr = img->bits();
- int i,j;
- // Przechodzimy po wszystkich wierszach obrazu
- for(i=0; i<wys; i++)
- {
- // Przechodzimy po pikselach danego wiersza
- // W kazdym wierszu jest "szer" pikseli (tzn. 4 * "szer" bajtow)
- for(j=0; j<szer; j++)
- {
- ptr[szer*4*i + 4*j]=255; // Skladowa BLUE
- ptr[szer*4*i + 4*j + 1] = 255; // Skladowa GREEN
- ptr[szer*4*i + 4*j + 2] = 255; // Skladowa RED
- }
- }
- }
- // Funkcja powoduje zamalowanie obszaru rysowania pewnym wzorem
- void MyWindow::rysuj1()
- {
- unsigned char *ptr;
- ptr = img->bits();
- int szer = img->width();
- int wys = img->height();
- int i,j;
- for(i=0;i<wys;i++)
- {
- for(j=0;j<szer ;j++)
- {
- ptr[szer*4*i + 4*j]=i;
- ptr[szer*4*i + 4*j + 1] = j;
- ptr[szer*4*i + 4*j + 2] = i*j;
- }
- }
- }
- // Funkcja powoduje zamalowanie obszaru rysowania pewnym wzorem
- void MyWindow::rysuj2()
- {
- unsigned char *ptr;
- ptr = img->bits();
- int szer = img->width();
- int wys = img->height();
- int i,j;
- for(i=0;i<wys;i++)
- {
- for(j=0;j<szer ;j++)
- {
- ptr[szer*4*i + 4*j]=i;
- ptr[szer*4*i + 4*j + 1] = j;
- ptr[szer*4*i + 4*j + 2] = i+j;
- }
- }
- }
- // Funkcja (slot) wywolywana po nacisnieciu przycisku myszy (w glownym oknie)
- void MyWindow::mousePressEvent(QMouseEvent *event)
- {
- // Pobieramy wspolrzedne punktu klikniecia
- int x = event->x();
- int y = event->y();
- // Sa to wspolrzedne wzgledem glownego okna,
- // Musimy odjac od nich wpolrzedne lewego gornego naroznika rysunku
- x -= poczX;
- y -= poczY;
- int kolor = 0;
- unsigned char *ptr;
- ptr = img->bits();
- // Sprawdzamy ktory przycisk myszy zostal klkniety
- if(event->button() == Qt::LeftButton)
- {
- // jezeli lewy to ustawiamy kolor na czarny
- kolor = 0;
- }
- else
- {
- // jezeli prawy to ustawiamy kolor na bialy
- kolor = 255;
- }
- // Sprawdzamy czy klikniecie nastapilo w granicach rysunku
- if ((x>=0)&&(y>=0)&&(x<szer)&&(y<wys))
- {
- // Ustawiamy kolor kliknietego piksela na bialy lub czarny
- ptr[szer*4*y + 4*x] = kolor;
- ptr[szer*4*y + 4*x + 1] = kolor;
- ptr[szer*4*y + 4*x + 2] = kolor;
- }
- // Odswiezamy komponent
- update();
- }
- void MyWindow::on_radioButton_3_clicked(bool checked)
- {
- if(checked){
- clickedg = false;
- clickedr = true;
- clickedb = false;
- }
- }
- void MyWindow::on_radioButton_4_clicked(bool checked)
- {
- if(checked){
- clickedg = true;
- clickedr = false;
- clickedb = false;
- }
- }
- void MyWindow::on_radioButton_5_clicked(bool checked)
- {
- if(checked){
- clickedg = false;
- clickedr = false;
- clickedb = true;
- }
- }
- int MyWindow::HSVtoRGB(int H, double S, double V, char c){
- double C = S * V;
- double X = C * (1 - abs(fmod(H / 60.0, 2) - 1));
- double m = V - C;
- double Rs, Gs, Bs;
- if(H >= 0 && H < 60) {
- Rs = C;
- Gs = X;
- Bs = 0;
- }
- else if(H >= 60 && H < 120) {
- Rs = X;
- Gs = C;
- Bs = 0;
- }
- else if(H >= 120 && H < 180) {
- Rs = 0;
- Gs = C;
- Bs = X;
- }
- else if(H >= 180 && H < 240) {
- Rs = 0;
- Gs = X;
- Bs = C;
- }
- else if(H >= 240 && H < 300) {
- Rs = X;
- Gs = 0;
- Bs = C;
- }
- else {
- Rs = C;
- Gs = 0;
- Bs = X;
- }
- if(c == 'r'){
- return (Rs + m) * 255;
- }
- if(c == 'g'){
- return (Gs + m) * 255;
- }
- if(c == 'b'){
- return (Bs + m) * 255;
- }
- }
- void MyWindow::on_verticalSlider_sliderMoved(int position)
- {
- unsigned char *ptr;
- ptr = img->bits();
- if(rh == true){
- if(clickedr == false){
- for(int i = 0; i < szer ; i++){
- for(int j = 0; j < wys ; j++){
- ptr[szer*4*j + 4*i] = 255 - i/2;
- ptr[szer*4*j + 4*i + 1] = j/2;
- ptr[szer*4*j + 4*i + 2] = position;
- }
- }
- }
- }
- update();
- }
- void MyWindow::on_verticalSlider_2_sliderMoved(int position)
- {
- unsigned char *ptr;
- ptr = img->bits();
- if(rh == true){
- if(clickedg == false){
- for(int i = 0; i < szer ; i++){
- for(int j = 0; j < wys ; j++){
- ptr[szer*4*j + 4*i] = 255 - i/2;
- ptr[szer*4*j + 4*i + 1] = position;
- ptr[szer*4*j + 4*i + 2] = j/2;
- }
- }
- update();
- }
- }
- }
- void MyWindow::on_verticalSlider_3_sliderMoved(int position)
- {
- unsigned char *ptr;
- ptr = img->bits();
- if(rh == true){
- if(clickedb == false){
- for(int i = 0; i < szer ; i++){
- for(int j = 0; j < wys ; j++){
- ptr[szer*4*j + 4*i] = position;
- ptr[szer*4*j + 4*i + 1] = 255 - i/2;
- ptr[szer*4*j + 4*i + 2] = j/2;
- }
- }
- update();
- }
- }
- }
- void MyWindow::on_spinBox_valueChanged(int arg1)
- {
- unsigned char *ptr;
- ptr = img->bits();
- choice = arg1;
- if(clickedr == true){
- for(int i = 0; i < szer ; i++){
- for(int j = 0; j < wys ; j++){
- ptr[szer*4*j + 4*i + 2] = choice;
- }
- }
- }
- if(clickedg == true){
- for(int i = 0; i < szer ; i++){
- for(int j = 0; j < wys ; j++){
- ptr[szer*4*j + 4*i + 1] = choice;
- }
- }
- }
- if(clickedb == true){
- for(int i = 0; i < szer ; i++){
- for(int j = 0; j < wys ; j++){
- ptr[szer*4*j + 4*i] = choice;
- }
- }
- }
- }
- void MyWindow::on_radioButton_clicked(bool checked)
- {
- if(checked){
- rh = true;
- unsigned char *ptr;
- ptr = img->bits();
- for(int i = 0; i < szer ; i++){
- for(int j = 0; j < wys ; j++){
- ptr[szer*4*j + 4*i] = 0;
- ptr[szer*4*j + 4*i + 1] = 0;
- ptr[szer*4*j + 4*i + 2] = 0;
- }
- }
- update();
- }
- }
- void MyWindow::on_radioButton_2_clicked(bool checked)
- {
- if(checked){
- rh = false;
- unsigned char *ptr;
- ptr = img->bits();
- for(int i = 0; i < szer ; i++){
- for(int j = 0; j < wys ; j++){
- ptr[szer*4*j + 4*i] = 0;
- ptr[szer*4*j + 4*i + 1] = 0;
- ptr[szer*4*j + 4*i + 2] = 0;
- }
- }
- update();
- }
- }
- void MyWindow::on_verticalSlider_4_sliderMoved(int position)
- {
- H = position ;
- unsigned char *ptr;
- ptr = img->bits();;
- if(rh == false){
- for(int i = 0; i < szer ; i++){
- for(int j = 0; j < wys ; j++){
- ptr[szer*4*j + 4*i] = HSVtoRGB(H,(double)i/szer,(double)j/wys,'b');
- ptr[szer*4*j + 4*i + 1] = HSVtoRGB(H,(double)i/szer,(double)j/wys,'g');
- ptr[szer*4*j + 4*i + 2] = HSVtoRGB(H,(double)i/szer,(double)j/wys,'r');
- }
- }
- update();
- }
- }
- void MyWindow::on_verticalSlider_6_sliderMoved(int position)
- {
- S = (double)position / 100;
- unsigned char *ptr;
- ptr = img->bits();
- if(rh == false){
- for(int i = 0; i < szer ; i++){
- for(int j = 0; j < wys ; j++){
- ptr[szer*4*j + 4*i] = HSVtoRGB(i/2,S,(double)j/wys,'b');
- ptr[szer*4*j + 4*i + 1] = HSVtoRGB(i/2,S,(double)j/wys,'g');
- ptr[szer*4*j + 4*i + 2] = HSVtoRGB(i/2,S,(double)j/wys,'r');
- }
- }
- update();
- }
- }
- void MyWindow::on_verticalSlider_5_sliderMoved(int position)
- {
- V = (double)position / 100;
- unsigned char *ptr;
- ptr = img->bits();
- if(rh == false){
- for(int i = 0; i < szer ; i++){
- for(int j = 0; j < wys ; j++){
- ptr[szer*4*j + 4*i] = HSVtoRGB((double)i/2,(double)j/wys,V,'b');
- ptr[szer*4*j + 4*i + 1] = HSVtoRGB((double)i/2,(double)j/wys,V,'g');
- ptr[szer*4*j + 4*i + 2] = HSVtoRGB((double)i/2,(double)j/wys,V,'r');
- }
- }
- update();
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement