пятница, 6 мая 2011 г.

создание маштабированного окна с элементами


#include <QApplication>
#include <QGraphicsScene>
#include <QGraphicsView>
#include <QGraphicsItem>
 
class CircleItem : public QGraphicsItem
{
public:
 CircleItem( qreal radius, QGraphicsItem* parent = 0 )
 : QGraphicsItem( parent )
 , radius_( radius ) {}
 virtual ~CircleItem() {}
 void paint( QPainter* painter, const QStyleOptionGraphicsItem* option, QWidget* widget = 0 )
 {
  painter->drawEllipse( QRectF( -radius_ / 2, -radius_ / 2, radius_, radius_ ) );
 }
 QRectF boundingRect() const
 {
  return QRectF( -radius_ / 2, -radius_ / 2, radius_, radius_ );
 }
private:
 qreal radius_;
};
 
class GraphicsView : public QGraphicsView
{
public:
 GraphicsView( QWidget* p = 0 ) : QGraphicsView( p ) {}
 void resizeEvent( QResizeEvent* e )
 {
  fitInView( scene()->sceneRect() );
 }
};
 
int main( int argc, char** argv )
{
 QApplication app( argc, argv );
 
 GraphicsView gv;
 QGraphicsScene scene( -150, -150, 300, 300 );
 
 gv.setScene( &scene );
 gv.setRenderHint( QPainter::Antialiasing );
 
 for( qreal r = 20; r < 300; r += 10 )
  scene.addItem( new CircleItem( r ) );
 
 gv.show();
 
 return app.exec();
}
 

namespace AQP

встретил такой helpers

void hoursMinutesSecondsForMSec(const int msec, int *hours,int *minutes, int *seconds);
результат. вы даете ей msec микросекунды , а она вам возвращает
сколько это часов минут и секунда.
examples


QString MainWindow::minutesSecondsAsStringForMSec(qint64 msec)
{

    int minutes;
    int seconds;
    AQP::hoursMinutesSecondsForMSec(msec, 0, &minutes, &seconds);
    return QString("%1:%2").arg(minutes, 2, 10, QChar(' '))
                           .arg(seconds, 2, 10, QChar('0'));
}

Возвращает путь в котором лежит приложение qt

QString applicationPathOf(const QString &path)
{
    QDir dir(QApplication::applicationDirPath());
#ifdef Q_WS_WIN
    if (dir.dirName().toLower() == "debug" ||
        dir.dirName().toLower() == "release")
        dir.cdUp();
#elif defined(Q_WS_MAC)
    if (dir.dirName() == "MacOS") {
        dir.cdUp();
        dir.cdUp();
        dir.cdUp();
    }
#endif
    if (!path.isEmpty())
        dir.cd(path);
    return dir.canonicalPath();
}


буду по мере изучения добавлять 

УЧИМ QT НОВЫМ ТРЮКАМ

Нашел сайт где возможно изменить поведение и вид элементов контроля.

http://wiki.metrotek.spb.ru/wiki/%D0%A3%D1%87%D0%B8%D0%BC_Qt_%D0%BD%D0%BE%D0%B2%D1%8B%D0%BC_%D1%82%D1%80%D1%8E%D0%BA%D0%B0%D0%BC

четверг, 5 мая 2011 г.

Умные указатели

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


template<class T> class Holder{
mutable T *obj;
public:
Holder<T>()throw():obj(0) {}
Holder<T>(T *x) throw():obj(x){}
Holder<T>(const Holder<T> & q) throw(){obj=q.obj;q.obj=0;}
Holder<T> & operator=(const Holder<T> & q) throw(){
if (obj) 
dbgprintf(_T("Holder d'nt free object"));
obj=q.obj;q.obj=0;return *this;}
Holder<T> & operator=(T* q) throw(){
if (obj) 
dbgprintf(_T("Holder d'nt free object"));
obj=q;return *this;}
//AG212 ~Holder<T>(){if (obj) delete obj;}
  ~Holder<T>(){if (obj) delete obj; obj=NULL;}
inline void release() throw() {obj=0;}
inline operator T*() throw(){return obj;}
inline operator const T*() const throw(){return obj;}
inline T* value() throw(){return obj;}
inline const T* const_value() const throw(){return obj;}
inline T* operator->() throw(){return obj;}
inline const T* operator->() const throw(){return obj;}
inline void free(){if (obj) delete obj;obj=0;}
inline bool isEmpty() const throw(){return !obj;}
inline bool empty() const throw(){return !obj;}
inline bool operator!() const throw(){return !obj;}
inline operator bool()const throw(){return obj!=0;}
};

среда, 4 мая 2011 г.

vector удаление элементов




for (vector<N>::iterator it = vec.begin();it != vec.end(); )
{
 if (некое условие)
  it = vec.erase(it);
 else
  ++it;
}
Способом перебора мы обрабатываем условие , если оно равно true то 
удаляем элемент и получаем обратно следующий iterator
иначе просто переходим к другому элементу.

Алена к примеру более глубже смотрит в эту тему , а точнее
куда девается дырка от бублика когда мы его сьедим.
ссылка на тему о дырке от бублика

QT новый слой (окно)

Главная особенность , это то что я могу на 1 сцене сделать сколько угодно
независимых "слоев"
как выглядит этот "слой"

class KAsteroidsView : public QWidget
{
    Q_OBJECT
public:
    KAsteroidsView( QWidget *parent = 0);
    virtual ~KAsteroidsView();
private:
    QGraphicsScene field;
    QGraphicsView view;
}
KAsteroidsView::KAsteroidsView( QWidget *parent)
    : QWidget( parent),
      field(0, 0, 640, 440),
      view(&field, this)
{
    view.setVerticalScrollBarPolicy( Qt::ScrollBarAlwaysOff );
    view.setHorizontalScrollBarPolicy( Qt::ScrollBarAlwaysOff );
    view.setCacheMode(QGraphicsView::CacheBackground);
    view.setViewportUpdateMode(QGraphicsView::BoundingRectViewportUpdate);
    view.setOptimizationFlags(QGraphicsView::DontClipPainter
                              | QGraphicsView::DontSavePainterState
                              | QGraphicsView::DontAdjustForAntialiasing);
    view.viewport()->setFocusProxy( this );
}
В общем не чего запутанного тут нет.
1. инициализация размера "слоя"
2. передача QGraphicsView основные параметры отображения и указывания viewport

Структура QT приложения.QMainWindow

class TopLevel : public QMainWindow
{
    Q_OBJECT
public:
    TopLevel( QWidget *parent = 0);
    virtual ~TopLevel();
private:
// следующее окно или слой , кому как лучше 
    KAsteroidsView *view;
}
TopLevel::TopLevel( QWidget *parent)
    : QMainWindow(parent)
{
QWidget *border = new QWidget( this );
// настройка палитры по умолчанию 
    QPalette palette;
    palette.setColor(border->backgroundRole(), Qt::black);
    border->setPalette(palette);
// позиция в центр
    setCentralWidget( border );
    QVBoxLayout *borderLayout = new QVBoxLayout( border );
    borderLayout->addStretch( 1 );
// делаем Layout и тоже позицируем в центр 
    QWidget *mainWin = new QWidget( border );
    mainWin->setFixedSize(640, 480);
// делаем фиксированный размер 
    borderLayout->addWidget( mainWin, 0, Qt::AlignHCenter );
// добаляем в Layout основной слой отображения mainWin
    borderLayout->addStretch( 1 );

}
В этой части делаем инициализацию ТОП экрана (1 level) что бы добавить другое "окно"
с отдельными Сигналами и Слотами

...
        view = new KAsteroidsView( mainWin );
    view->setFocusPolicy( Qt::StrongFocus );
}