Есть вопрос?
Зайди на форум

Поиск на сайте: Advanced

Denix - новый дистрибутив Linux. Русификация Ubuntu и установка кодеков

dkws.org.ua
Форум сайта dkws.org.ua
 
Главная    ТемыТемы    АльбомАльбом    РегистрацияРегистрация 
 ПрофильПрофиль   Войти и проверить личные сообщенияВойти и проверить личные сообщения   ВходВход 

программирование с использованием Qt

 
Начать новую тему Ответить на тему    Список форумов dkws.org.ua -> Программирование/C/C++
 
Автор Сообщение
ruslan89

Завсегдатай


Зарегистрирован: 09.01.2010
Сообщения: 799

СообщениеДобавлено: Пн Фев 15, 2010 5:28 am    Заголовок сообщения: программирование с использованием Qt
Ответить с цитатой

вот интересно стало как нарисовать что-нибудь. делаю в qt-creator
Код:

mw.cpp:

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QtGui>

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent), ui(new Ui::MainWindow)
{
    ui->setupUi(this);
}

MainWindow::~MainWindow()
{
    delete ui;
}

void MainWindow::on_pushButton_clicked()
{
        QPainter painter();
        QConicalGradient gradient(width() / 2, height() / 2, 0);

        gradient.setColorAt(0, Qt::red);
        gradient.setColorAt(0.4, Qt::green);
        gradient.setColorAt(0.8, Qt::blue);
        gradient.setColorAt(1, Qt::red);
        painter.setBrush(gradient);
        painter.drawRect(rect());
}


Код:

mw.h:
#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QtGui/QMainWindow>

namespace Ui
{
    class MainWindow;
}

class MainWindow : public QMainWindow
{
    Q_OBJECT


public:
    MainWindow(QWidget *parent = 0);
    ~MainWindow();

private:
    Ui::MainWindow *ui;

private slots:
    void on_pushButton_clicked();
};

#endif // MAINWINDOW_H

должно получиться симпотично Very Happy . но получаю ошибку:
/mnt/data/programming/Qt/domino/mainwindow.cpp:26: error: request for member ‘setBrush’ in ‘painter’, which is of non-class type ‘QPainter()’

/mnt/data/programming/Qt/domino/mainwindow.cpp:27: error: request for member ‘drawRect’ in ‘painter’, which is of non-class type ‘QPainter()’

я новичёк в линукс, поэтому прошу сильно не ругать Smile . помогите, пожалуйста. Embarassed


Последний раз редактировалось: ruslan89 (Вс Мар 14, 2010 8:12 am), всего редактировалось 1 раз
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
Anderson

Завсегдатай


Зарегистрирован: 08.07.2006
Сообщения: 642
Откуда: localhost

СообщениеДобавлено: Пн Фев 15, 2010 5:10 pm    Заголовок сообщения:
Ответить с цитатой

Код:

        QPainter painter();
        QConicalGradient gradient(width() / 2, height() / 2, 0);

        gradient.setColorAt(0, Qt::red);
        gradient.setColorAt(0.4, Qt::green);
        gradient.setColorAt(0.8, Qt::blue);
        gradient.setColorAt(1, Qt::red);
        painter.setBrush(gradient);
        painter.drawRect(rect());

По-моему, нужно что-то типа етого:
Код:

        QPainter *painter = new QPainter();
        QConicalGradient gradient(width() / 2, height() / 2, 0);

        gradient.setColorAt(0, Qt::red);
        gradient.setColorAt(0.4, Qt::green);
        gradient.setColorAt(0.8, Qt::blue);
        gradient.setColorAt(1, Qt::red);
        painter->setBrush(gradient);
        painter->drawRect(rect());

_________________
ArchLinux + Enlightenment 17 (E17)
Вернуться к началу
Посмотреть профиль Отправить личное сообщение anderson.dunai@gmail.com Моб. телефон ICQ Number
ruslan89

Завсегдатай


Зарегистрирован: 09.01.2010
Сообщения: 799

СообщениеДобавлено: Вт Фев 16, 2010 8:26 am    Заголовок сообщения:
Ответить с цитатой

пасиб. стало компилица, но тепеть, когда жму по кнопке - получаю
Код:

QPainter::setBrush: Painter not active
QPainter::drawRects: Painter not active

Confused
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
Anderson

Завсегдатай


Зарегистрирован: 08.07.2006
Сообщения: 642
Откуда: localhost

СообщениеДобавлено: Вт Мар 09, 2010 10:26 pm    Заголовок сообщения:
Ответить с цитатой

Посмотри пример рисования в examples. Там нужно, насколько я помню, делать клас-наследник от QWidget и затем переопределять ему функцию "void paintEvent()". Хз, как еще можно, но я только ето знаю. Геморно немного...

инициализация проги (MainWindow::MainWindow например):
Код:

    renderArea = new RenderArea(ui->scrollArea);
    renderArea->setGeometry(QRect(0,0,1000,1000));
}


renderarea.h
Код:

#include <QBrush>
#include <QPen>
#include <QPixmap>
#include <QWidget>
#include <iostream>

class RenderArea : public QWidget
{
    Q_OBJECT
public:
    RenderArea(QWidget *parent);
public slots:
protected:
    void paintEvent(QPaintEvent *);
    void mouseMoveEvent(QMouseEvent *);
    void mousePressEvent(QMouseEvent *);
private:
    QPoint last, old;
    QPoint camera;
};


renderarea.cpp
Код:

#include <renderarea.h>
#include <QtGui>

RenderArea::RenderArea(QWidget *parent)
        : QWidget(parent)
{
    old=QPoint(0,0);
    last=QPoint(0,0);

    camera=QPoint(0,0);
}

void RenderArea::paintEvent(QPaintEvent *)
{
    QPainter painter(this);
    painter.setPen(Qt::SolidLine);
    painter.setBrush(Qt::SolidPattern);
//    std::cout<<old.x()<<"*"<<old.y()<<"   "<<last.x()<<"*"<<last.y()<<"\n";
    painter.drawLine(camera.x()+100, camera.y()+100, camera.x()+110, camera.y()+110);
}

void RenderArea::mouseMoveEvent(QMouseEvent *m)
{
    QPoint mod;     // mouse move factor

    mod = QPoint(m->x()-old.x(), m->y()-old.y());   // Calculate, how much was cursor moved
    camera=QPoint(camera.x()+mod.x(),camera.y()+mod.y());   // Move camera

    std::cout   <<  camera.x()  <<  ";" <<  camera.y()  <<  "\n";

    old=m->pos();   // Set current mouse pos to "old"
    repaint();
}

void RenderArea::mousePressEvent(QMouseEvent *m)
{
    old=QPoint(m->x(),m->y());
}

//void RenderArea::acceptDrop


Так я начал делать просмотрщик карт (надо сделать знакомому)

Иногда компиль орет, что явно рисовать можно только из функции paintEvent(). То есть, как я понял, алгоритм таков (я не уверен):

1) Установить различные флаги (что рисуется, где и т.п.) внутри класса.
2) Обьявить метод класса paintEvent, который рисует что-то в зависимости от флагов/переменных класса.
3) Вызвать метод update() или repaint(), или как там - не помню. Он и вызовет paintEvent().

На первый взгляд, довольно долго и нееффективно, но наоборот - позволяет перерисовывать виджет только тогда, когда хочешь.

То есть, фактически, явно нужно переопределить по крайней мере конструктор и paintEvent(). Ну и дописать свои функции для интерфейса с программой.

Исходники: http://dunai.pp.ua/files/mapit.tar.gz
_________________
ArchLinux + Enlightenment 17 (E17)
Вернуться к началу
Посмотреть профиль Отправить личное сообщение anderson.dunai@gmail.com Моб. телефон ICQ Number
ruslan89

Завсегдатай


Зарегистрирован: 09.01.2010
Сообщения: 799

СообщениеДобавлено: Вс Мар 14, 2010 8:20 am    Заголовок сообщения:
Ответить с цитатой

с рисованием пока повременю.
ещё вопросик родился. мне нужна переменная, которую можно было бы испольтлзовать из любого места программы и из различных функций!
я описываю глобальную переменную для класса, но если при инициализации (запуске) програмы ей присвоить значение 4, а при ,например, нажатии клавиши его считать, то значение этой переменной не будут равно 4. как я понимаю так и должно быть, то как достигнуть цели? подскажите пожалуйсто. Smile
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
Anderson

Завсегдатай


Зарегистрирован: 08.07.2006
Сообщения: 642
Откуда: localhost

СообщениеДобавлено: Вс Мар 14, 2010 12:17 pm    Заголовок сообщения:
Ответить с цитатой

если имеешь в виду менять класс в местах, где он не обьявлен, то единственное решение, которое я нашел для себя в таих случаях - ето передавать функции указатель на обьект, с которым буду работать (только не забывай инклуд):

Код:
class Foo
{
public:
     Foo(int newValue=0) { bar=newValue; };
     void someFunc();
     int bar;
};

// .....

class mw : public QMainWindow {
    Q_OBJECT
public:
     mw(QWidget *parent = 0);
     ~mw();
     void onEvent1(Foo*);
     void onEvent2(Foo*);
private:
     Foo *foo1;
};

class mw : public QObject
{ Q_OBJECT
     foo1 = new Foo(4);
}

void mw::onEvent1(Foo* someFoo)
{
     someFoo->someFunc();
     someFoo->bar=6;
}
void mw::onEvent2(Foo* someFoo)
{
     someFoo->someFunc();
     someFoo->bar=7;
}


таким образом, я могу менять свойства одного класса в других классах.
_________________
ArchLinux + Enlightenment 17 (E17)
Вернуться к началу
Посмотреть профиль Отправить личное сообщение anderson.dunai@gmail.com Моб. телефон ICQ Number
ruslan89

Завсегдатай


Зарегистрирован: 09.01.2010
Сообщения: 799

СообщениеДобавлено: Вс Мар 14, 2010 1:22 pm    Заголовок сообщения:
Ответить с цитатой

не совсем то. у меня один класс! пример:
Код:

mw.cpp

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent), ui(new Ui::MainWindow)
{
    ui->setupUi(this);
   x = 4;
}

MainWindow::~MainWindow()
{
    delete ui;
}

void MainWindow::on_pushButton_8_clicked()
{
   QString str2;
   str2.setNum(x);
   ui->lineEdit->setText(str2); //здесь не получал то значение, которое присваивал в начале!.
}

Код:

mw.h

class MainWindow : public QMainWindow
{
    Q_OBJECT

int x;

public:
    MainWindow(QWidget *parent = 0);
    ~MainWindow();
...

сейчас всё нормально!!! очевидно чде-то допустил ошибку. а сейчас сходил прогулялся и переписал ошибочный кусок Wink Anderson, пасиб.
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
Anderson

Завсегдатай


Зарегистрирован: 08.07.2006
Сообщения: 642
Откуда: localhost

СообщениеДобавлено: Вс Мар 14, 2010 4:43 pm    Заголовок сообщения:
Ответить с цитатой

всегда пожалуйста Smile
_________________
ArchLinux + Enlightenment 17 (E17)
Вернуться к началу
Посмотреть профиль Отправить личное сообщение anderson.dunai@gmail.com Моб. телефон ICQ Number
Показать сообщения:   
Начать новую тему Ответить на тему    Список форумов dkws.org.ua -> Программирование/C/C++ Часовой пояс: GMT
Страница 1 из 1
 Главная страница сайта
 
Перейти:  
Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете голосовать в опросах
© Колисниченко Денис