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

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

Страниц: 1 2 [3] 4 5 6   Вниз
  Печать  
Автор Тема: Ханойские башни  (Прочитано 38560 раз)
BlackTass
Гость
« Ответ #30 : Январь 22, 2010, 02:58 »

и еще проблемка
Код:
qDeleteAll(item.begin(), item.end());
item.clear();
это хорошо, но как мне сделать попроще чтобы оно не удаляло сразу, и из-за этого не отоброжалось, а после того как окно закрываю
дак перехватите closeEvent и там удаляйте

да гмм и можно подробней описать плиз это
Код:
bool QGraphicsItem::collidesWithItem ( const QGraphicsItem * other, Qt::ItemSelectionMode mode = Qt::IntersectsItemShape ) const   [virtual]
на примере, если мой квадрат item[1] соприкоснется с line_2 , как организовать с помощью этого кода, и где писать что дальше делаться будет.
вызываете item[1]->collidesWithItem(line_2). Если там истина, значит пересечение есть и делаете то что нужно в случае пересечения (ну наверно вам нужно проверить можно ли класть кольцо на этот штырь и перебросить кольцо).
Записан
Nekron
Гость
« Ответ #31 : Январь 22, 2010, 11:39 »

ясно, спасибо )
Записан
Nekron
Гость
« Ответ #32 : Январь 24, 2010, 15:23 »

хмм, может дело в том что у меня линия создана в дизайнере, вобщем выдает ошибку
Код:
 if(item[15]->collidesWithItem(line_3))
        {item[15]->setRect(QRectF(-225.0, 160.0, 190.0, 25.0));}

C:/MAKSIM 100117/hanoi/src/mainwindowimpl.cpp:31: error: no matching function for call to 'QGraphicsRectItem::collidesWithItem(QFrame*&)'

в такомже варианте
Код:
        if(item[15]->collidesWithItem(item[13]))
        {item[15]->setRect(QRectF(-225.0, 160.0, 190.0, 25.0));}

программа запускается, однако при наведении на 13 квадрат координаты никак не меняются, подскажите плз в чем ошибка.

Еще можете подсказать естьли  вариант колайда, только такого если ни с чем не соприкоснулось.

и ммм    В замешательстве  можно пример как перехватить closeEvent
Записан
Nekron
Гость
« Ответ #33 : Январь 24, 2010, 16:19 »

Немного понял, оноже сразу программу выполняет и уже не смотрит на условия после выполнения, но как мне сделать чтобы оно после выполнения программы проверяло условия после перемещения?

и насчет линийже как сделать чтобы работали с колайдом созданные в дизайнере линии? или прийдеться создавать объекты сцены линии?
Записан
BlackTass
Гость
« Ответ #34 : Январь 24, 2010, 18:06 »

Немного понял, оноже сразу программу выполняет и уже не смотрит на условия после выполнения, но как мне сделать чтобы оно после выполнения программы проверяло условия после перемещения?
э, что? вы хотите чтобы после того как ваша программа завершилась, она что то делала еще? так не бывает

и насчет линийже как сделать чтобы работали с колайдом созданные в дизайнере линии? или прийдеться создавать объекты сцены линии?
надо создать графикайтемы конечно чтобы с ними можно было коллизии проверять

По поводу closeEvent и его перехвата.
В том классе, у объектов которого хотите перехватить closeEvent просто определите протектед метод
void closeEvent ( QCloseEvent * event ) 
и в нем делайте что вам нужно
« Последнее редактирование: Январь 24, 2010, 18:08 от BlackTass » Записан
Nekron
Гость
« Ответ #35 : Январь 24, 2010, 18:18 »

эмм ну я так понял чтобы срабатывало надо сигнал и слот соеденить в коде, теперь думаю как обозначить сигнал item-а(или чего лучше?) что он отпущен, ну а слотом функцию в this которая перерисовывает как надо, это вроде понятно.
Хотя... я пока назначил сигнал на одну из кнопок,
Код:
connect(pushButton,SIGNAL(clicked()),this,SLOT(Move()));
когда нажимается, а слот соответсвенно функцию
Код:
void MainWindowImpl::Move()
{
    item[15]->setRect(QRectF(-225.0, 160.0, 190.0, 25.0));
}

проблема вот в чем первый раз когда я кнопку нажимаю оно выполняется, однако потом, когда я переместившийся квадрат передвину на другое место и снова нажимаю кнопку, то он уже не перемещается. В чем моя ошибка?
Записан
BlackTass
Гость
« Ответ #36 : Январь 24, 2010, 19:37 »


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

может выложите минимально компилируемый исходник?
Записан
Nekron
Гость
« Ответ #37 : Январь 24, 2010, 19:41 »

Код:
#include "mainwindowimpl.h"
#include <QGraphicsRectItem>
//
QList<QGraphicsRectItem *>item;
MainWindowImpl::MainWindowImpl( QWidget * parent, Qt::WFlags f)
: QMainWindow(parent, f)
{
setupUi(this);
QGraphicsScene * scene = new QGraphicsScene;
scene->setSceneRect(QRectF(-500,-500,1000,1000));
graphicsView->setScene(scene);

        QGraphicsLineItem *line[6];
  int i;
for (int i = 1; i < 17; i++) {
    item.append(new QGraphicsRectItem());
}

        for (i = 1; i < 7; i++) {
    line[i] = new QGraphicsLineItem();
        }

        line[1]->setLine(-330, 260, -330.0, -170.0);line[2]->setLine(-450, 260, -210.0, 260.0);
        line[3]->setLine(-60, 260, -60.0, -170.0);line[4]->setLine(-180, 260, 60.0, 260.0);
        line[5]->setLine(240, 260, 240.0, -170.0);line[6]->setLine(90, 260, 360.0, 260.0);
        for(i=1;i<7;i++)
        {scene->addItem(line[i]);}

        for (i=1;i<16;i++)
{item[i]->setRect(QRectF(-425.0+5*i, 260.0-25*i, 190.0-10*i, 25.0));
scene->addItem(item[i]);}

item[15]->setFlag(QGraphicsItem::ItemIsMovable, true);
        item[13]->setFlag(QGraphicsItem::ItemIsMovable, true);

        if(item[15]->collidesWithItem(item[13]))
        {item[15]->setRect(QRectF(-225.0, 160.0, 190.0, 25.0));}
        connect(pushButton,SIGNAL(clicked()),this,SLOT(Move()));
        connect(pushButton_2,SIGNAL(clicked()),this,SLOT(Delete()));

}


void MainWindowImpl::Move()
{
    item[15]->setRect(QRectF(-225.0, 160.0, 190.0, 25.0));
}

void MainWindowImpl::Delete()
{        qDeleteAll(item.begin(), item.end());
    item.clear();
}

ммм вот? )
Записан
BRE
Гость
« Ответ #38 : Январь 24, 2010, 19:50 »

Компилябельный пример, это архив со всеми необходимыми файлами для сборки проекта.  Подмигивающий

Массивы нумеруются с 0, а не с 1.
Ниже происходит выход за пределы массива line.
Код:
        QGraphicsLineItem *line[6];
  int i;

        for (i = 1; i < 7; i++) {
    line[i] = new QGraphicsLineItem();
        }
Записан
Nekron
Гость
« Ответ #39 : Январь 24, 2010, 20:52 »

аа вот )
я нумерую с 1, прост потомучто удобней так как-то )

почему выходит? там написано <7 тоесть когда i=7 то оно не делает еше раз, да и ошибкаб была у меня, уже сталкивался с такой,а ее нет.
Записан
BlackTass
Гость
« Ответ #40 : Январь 24, 2010, 20:54 »

аа вот )
я нумерую с 1, прост потомучто удобней так как-то )

почему выходит? там написано <7 тоесть когда i=7 то оно не делает еше раз, да и ошибкаб была у меня, уже сталкивался с такой,а ее нет.
вы создаете массив из 6 элементов. Их индексы: 0, 1, 2, 3, 4, 5. Элемента с индексом 6 здесь нет, но вы к нему обращаетесь.
Записан
BRE
Гость
« Ответ #41 : Январь 24, 2010, 20:55 »

почему выходит? там написано <7 тоесть когда i=7 то оно не делает еше раз, да и ошибкаб была у меня, уже сталкивался с такой,а ее нет.
Инструкция QGraphicsLineItem *line[6]; определяет массив из 6 указателей на QGraphicsLineItem.
Индексация идет от 0, т.е. валидные индексы 0, 1, 2, 3, 4, 5. А ты последний элемент заносишь по индексу 6!

BlackTass уже ответил...  Улыбающийся
Записан
Nekron
Гость
« Ответ #42 : Январь 24, 2010, 20:55 »

аа, да-да вы правы, странно правда почемуто все 6 линий нормально рисовало почемуто
Записан
BRE
Гость
« Ответ #43 : Январь 24, 2010, 20:56 »

аа, да-да вы правы, странно правда почемуто все 6 линий нормально рисовало почемуто
В релизе думаю начались бы проблемы.
Записан
Nekron
Гость
« Ответ #44 : Январь 24, 2010, 21:46 »

хмм, так можете что-то в качестве сигнала посоветовать?)  чтобы запускал функцию, после того как я отпускаю перетаскиваемый кубик
Записан
Страниц: 1 2 [3] 4 5 6   Вверх
  Печать  
 
Перейти в:  


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