|
Автор |
Сообщение |
ruslan89
Завсегдатай
Зарегистрирован: 09.01.2010 Сообщения: 799
|
|
|
|
вот интересно стало как нарисовать что-нибудь. делаю в 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
|
должно получиться симпотично . но получаю ошибку:
/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()’
я новичёк в линукс, поэтому прошу сильно не ругать . помогите, пожалуйста.
Последний раз редактировалось: ruslan89 (Вс Мар 14, 2010 8:12 am), всего редактировалось 1 раз |
|
Вернуться к началу |
|
|
Anderson
Завсегдатай
Зарегистрирован: 08.07.2006 Сообщения: 642 Откуда: localhost
|
|
|
|
Код: |
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) |
|
Вернуться к началу |
|
|
ruslan89
Завсегдатай
Зарегистрирован: 09.01.2010 Сообщения: 799
|
|
|
|
пасиб. стало компилица, но тепеть, когда жму по кнопке - получаю
Код: |
QPainter::setBrush: Painter not active
QPainter::drawRects: Painter not active
|
|
|
Вернуться к началу |
|
|
Anderson
Завсегдатай
Зарегистрирован: 08.07.2006 Сообщения: 642 Откуда: localhost
|
|
|
|
Посмотри пример рисования в 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) |
|
Вернуться к началу |
|
|
ruslan89
Завсегдатай
Зарегистрирован: 09.01.2010 Сообщения: 799
|
|
|
|
с рисованием пока повременю.
ещё вопросик родился. мне нужна переменная, которую можно было бы испольтлзовать из любого места программы и из различных функций!
я описываю глобальную переменную для класса, но если при инициализации (запуске) програмы ей присвоить значение 4, а при ,например, нажатии клавиши его считать, то значение этой переменной не будут равно 4. как я понимаю так и должно быть, то как достигнуть цели? подскажите пожалуйсто. |
|
Вернуться к началу |
|
|
Anderson
Завсегдатай
Зарегистрирован: 08.07.2006 Сообщения: 642 Откуда: localhost
|
|
|
|
если имеешь в виду менять класс в местах, где он не обьявлен, то единственное решение, которое я нашел для себя в таих случаях - ето передавать функции указатель на обьект, с которым буду работать (только не забывай инклуд):
Код: |
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) |
|
Вернуться к началу |
|
|
ruslan89
Завсегдатай
Зарегистрирован: 09.01.2010 Сообщения: 799
|
|
|
|
не совсем то. у меня один класс! пример:
Код: |
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();
...
|
сейчас всё нормально!!! очевидно чде-то допустил ошибку. а сейчас сходил прогулялся и переписал ошибочный кусок Anderson, пасиб. |
|
Вернуться к началу |
|
|
Anderson
Завсегдатай
Зарегистрирован: 08.07.2006 Сообщения: 642 Откуда: localhost
|
|
|
|
всегда пожалуйста _________________ ArchLinux + Enlightenment 17 (E17) |
|
Вернуться к началу |
|
|
|
|
 Главная страница сайта
|
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете голосовать в опросах
|
|