crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )

 
Ответить в данную темуНачать новую тему
> Помогите с перемещением по qgraphicsscene, не получается описать движение qgraphictextitem
hom9n
  опции профиля:
сообщение 25.3.2011, 16:50
Сообщение #1


Новичок


Группа: Новичок
Сообщений: 8
Регистрация: 26.2.2011
Пользователь №: 2451

Спасибо сказали: 0 раз(а)




Репутация:   0  


Помогите пожалуйста!!! Пытаюсь сделать перемещение с помощью подключения вот этого класса
MvScene::MvScene(QObject *parent) : QGraphicsScene(parent)
{    x=0;
        y=0;
    mov=0;
        backgr1=addPixmap(QPixmap("/backgrounds/1"));
        backgr1->setData(0, "Background");
}

void MvScene::mousePressEvent(QGraphicsSceneMouseEvent * mouseEvent)
{QGraphicsItem * item = itemAt(mouseEvent->scenePos());
    if (mouseEvent->button() == Qt::LeftButton)
    {        if (item)
                    if (item->data(0) == "Text")
                {item->setSelected(true);
                mov=1;
                point=mouseEvent->pos();
                curtext=item->data(0).toString();
                item->setCursor(Qt::ClosedHandCursor);
                 }}
    if (mouseEvent->button() == Qt::RightButton) {
placeBox(mouseEvent->scenePos().x(), mouseEvent->scenePos().y());
}
}

void MvScene::mouseMoveEvent(QGraphicsSceneMouseEvent *mouseEvent/*,QGraphicsSceneMoveEvent *move*/)
{QGraphicsItem * item = itemAt(mouseEvent->scenePos());
    if (item)
                if (item->data(0) == "Text")
              {item->setCursor(Qt::PointingHandCursor);*/
        if(mov==1){
              item->setPos((mouseEvent->scenePos().x()-point.x()),(mouseEvent->scenePos().y()-point.y()));

          MvScene::mouseMoveEvent(mouseEvent/*,move*/);}
}

void MvScene::mouseReleaseEvent(QGraphicsSceneMouseEvent *mouseEvent)
{
    QGraphicsItem * item = itemAt(mouseEvent->scenePos());
            if (mouseEvent->button() == Qt::LeftButton)
        {         if (item)
                        if (item->data(0) == curtext)
                            if (mov==1)
                    {item->setSelected(false);
                    item->setCursor(Qt::PointingHandCursor);
                    mouseEvent->accept();
                       mov=2;
                qDebug()<<"release";
}

void MvScene::makeText(/*int inc, QString str, int height, int otstup, QFont font*/)
{         QGraphicsItem * item;
                item= addText("465468464654654654654654"/*str,font)->setPos(otstup,(height-((otstup*2)/16))*inc*/);
                item->translate(x,y);
                item->setData(0, "Text");
                item->setAcceptHoverEvents(true);
                item->setFlags(QGraphicsItem::ItemIsMovable | QGraphicsItem::ItemSendsGeometryChanges);
                item->setFlag(QGraphicsItem::ItemIsSelectable);
    }
}

В главной программе написано следующее:
class MvScene;

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
       ui->setupUi(this);
       z=0;
      scene=new MvScene;
    image1=":/backgrounds/1";
    image2=":/backgrounds/2";
        scene->setSceneRect(0,0,900,500);
        backgr.setCoords(0,0,scene->width(),scene->height());
        resize(900,500);
    ui->graphicsView->setScene(scene);

}

void MainWindow::ifcurtabset()
{
    if (ui->tabWidget->currentIndex()==0)
        setfields1();
    else
        setfields2();
}

void MainWindow::resize(int w, int h){
    QMatrix m = ui->graphicsView->matrix();
    if (ui->radioButton->isChecked())
    m.setMatrix(441.0/w, 0, 0, 229.0/h, m.dx(), m.dy());
    else
    {m.setMatrix(300.0/w, 0, 0, 441.0/h, m.dx(), m.dy());
    }
    ui->graphicsView->setMatrix(m);
    if (ui->tabWidget->currentIndex()==0)
    pix.load(image1);
    else
    pix.load(image2);
    wid=w;
    hei=h;
    scene->addRect(ramka);
    ifcurtabset();
    }

void MainWindow::setfields1()
{scene->clear();
    pix.load(image1);
    scene->addPixmap(pix)->scale(scene->width()/pix.width(),scene->height()/pix.height());
    scene->addRect(0,0,wid,hei);
    ramka=QRect(30,30,(wid-60),(hei-60));
    scene->addRect(ramka);
    otstup=ramka.left();
    scene->makeText();
}

При запуске программа работает нормально, но при попытке перемещения на mousemoveevent зацыкливается и вылитает. Подскажите пожалуйста в чем проблема??
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
abc
  опции профиля:
сообщение 25.3.2011, 17:12
Сообщение #2


Участник
**

Группа: Участник
Сообщений: 221
Регистрация: 16.12.2010
Из: СПб
Пользователь №: 2272

Спасибо сказали: 26 раз(а)




Репутация:   4  


код нечитабельный
перемещай итем в классе итема, а не сцены:
void TextItem::mousePressEvent(QGraphicsSceneMouseEvent *event)
{
          point=event->pos();
}
void TextItem::mouseMoveEvent(QGraphicsSceneMouseEvent *event)
{
          setPos(event->pos()-point);
}

Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
hom9n
  опции профиля:
сообщение 25.3.2011, 22:07
Сообщение #3


Новичок


Группа: Новичок
Сообщений: 8
Регистрация: 26.2.2011
Пользователь №: 2451

Спасибо сказали: 0 раз(а)




Репутация:   0  


Цитата(abc @ 25.3.2011, 16:12) *
код нечитабельный
перемещай итем в классе итема, а не сцены:
void TextItem::mousePressEvent(QGraphicsSceneMouseEvent *event)
{
          point=event->pos();
}
void TextItem::mouseMoveEvent(QGraphicsSceneMouseEvent *event)
{
          setPos(event->pos()-point);
}

Это уже пробовал... просто прога вылетает...
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
hom9n
  опции профиля:
сообщение 28.3.2011, 0:41
Сообщение #4


Новичок


Группа: Новичок
Сообщений: 8
Регистрация: 26.2.2011
Пользователь №: 2451

Спасибо сказали: 0 раз(а)




Репутация:   0  


Я все таки сделал перемещение в классе сцены и работает прекрасно. Буду рад если кому пригодится. Вот код:
void MvScene::mousePressEvent(QGraphicsSceneMouseEvent * mouseEvent)
{QGraphicsItem * item = itemAt(mouseEvent->scenePos());
    item->setZValue(1000.0);
    if (mouseEvent->button() == Qt::LeftButton)
    {        if (item)
        if (item->data(0).toString()=="Text1")
                {item->setSelected(true);
                mov=1;
                point=mouseEvent->pos();
                curtext=item->data(0).toString();
            }}
    QGraphicsScene::mousePressEvent(mouseEvent);}


void MvScene::mouseMoveEvent(QGraphicsSceneMouseEvent *mouseEvent)
{QGraphicsItem * item = itemAt(mouseEvent->scenePos());
    if (item)
                if (item->data(0) == curtext)

        if(mov==1)
            QGraphicsScene::mouseMoveEvent(mouseEvent);
        }
void MvScene::mouseReleaseEvent(QGraphicsSceneMouseEvent *mouseEvent)
{
    QGraphicsItem * item = itemAt(mouseEvent->scenePos());
            if (mouseEvent->button() == Qt::LeftButton)
                if (item)
                        if (item->data(0) == curtext)

                    {item->setSelected(false);
                    mouseEvent->accept();
                    mov=0;
                item->setZValue(0);}
QGraphicsScene::mouseReleaseEvent(mouseEvent);

Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


4 чел. читают эту тему (гостей: 4, скрытых пользователей: 0)
Пользователей: 0




RSS Текстовая версия Сейчас: 18.1.2025, 8:11