#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(); }
пятница, 6 мая 2011 г.
создание маштабированного окна с элементами
namespace AQP
встретил такой helpers
void hoursMinutesSecondsForMSec(const int msec, int *hours,int *minutes, int *seconds);
результат. вы даете ей msec микросекунды , а она вам возвращает
сколько это часов минут и секунда.
examples
QString MainWindow::minutesSecondsAsStringForMSec(qint64 msec)
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
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;}
};
полезно.
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
независимых "слоев"
как выглядит этот "слой"
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_OBJECTpublic: 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 основной слой отображения mainWinborderLayout->addStretch( 1 );
}В этой части делаем инициализацию ТОП экрана (1 level) что бы добавить другое "окно"с отдельными Сигналами и Слотами
... view = new KAsteroidsView( mainWin );
view->setFocusPolicy( Qt::StrongFocus );
}
Подписаться на:
Сообщения (Atom)