crossplatform.ru

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

История благодарностей участнику lanz ::: Спасибо сказали: 113 раз(а)
Дата поста: В теме: За сообщение: Спасибо сказали:
4.3.2013, 12:30 mdiArea как работать с виджетами
residuesCenterForm widget(this);
residuesFilialForm widget(this);


Нельзя создавать виджет на стеке. Нужно в куче:
residuesCenterForm *widget = new residuesCenterForm;
electronik,
4.3.2013, 10:47 QListWidget
Ненене!
QListWidgetItem *item = view->takeItem (id);
delete item;
demaker,
27.2.2013, 9:03 3D пример движения над сценой
Ох с чего же начать :lol:
1.
Раскрывающийся текст

void GLWidget::saveGLState()
{
  glPushAttrib(GL_ALL_ATTRIB_BITS);
  glMatrixMode(GL_PROJECTION);
  glPushMatrix();
  glMatrixMode(GL_MODELVIEW);
  glPushMatrix();
}

void GLWidget::restoreGLState()
{
  glMatrixMode(GL_PROJECTION);
  glPopMatrix();
  glMatrixMode(GL_MODELVIEW);
  glPopMatrix();
  glPopAttrib();
}


Push и Pop должны идти в разном порядке (см. как работает стек (последний пришел-первый ушел)

2. Сохранение состояния не нужны (по крайней мере сейчас)
3. Всю настройку источников света можно вынести в initializeGL
4. Чуть покрутил коэффициенты, убрал мусор
Раскрывающийся текст
void GLWidget::initializeGL()
{
    makeCurrent ();
    glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
    glClearDepth(1.0f);
    glEnable (GL_NORMALIZE);
    glEnable(GL_DEPTH_TEST);
    glDepthFunc(GL_LEQUAL);    

    glShadeModel(GL_SMOOTH);

    glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_FASTEST);

    // Enable light and set up 2 light sources (GL_LIGHT0 and GL_LIGHT1)
    glEnable(GL_LIGHTING);
    glEnable(GL_LIGHT0);
    
    float ambientLight0[] = { 0.25f, 0.25f, 0.25f, 0.6f };
    float diffuseLight0[] = { 0.2f, 0.2f, 0.2f, 0.1f };
    float specularLight0[] = { 1.0f, 1.0f, 1.0f, 1.0f };
    float position0[] = { 0, 0, -40.0f, 1.0f };

    // Assign created components to GL_LIGHT0
    glLightfv(GL_LIGHT0, GL_AMBIENT, ambientLight0);
    glLightfv(GL_LIGHT0, GL_DIFFUSE, diffuseLight0);
    glLightfv(GL_LIGHT0, GL_SPECULAR, specularLight0);
    glLightfv(GL_LIGHT0, GL_POSITION, position0);

      //
  //light model properties
  //
  float model_ambient[] = {0.4f, 0.4f, 0.4f, 1.0f};

  glLightModelfv(GL_LIGHT_MODEL_AMBIENT, model_ambient);     //small white ambient light


  //
  // meterial properties
  //
  float no_mat[] = {0.0f, 0.0f, 0.0f, 1.0f};
  float mat_ambient[] = {0.7f, 0.7f, 0.7f, 0.1f};
  float mat_diffuse[] = {0.1f, 0.5f, 0.8f, 0.1f};
  float mat_specular[] = {1.0f, 1.0f, 1.0f, 1.0f};
  float high_shininess = 0.1f;

  glMaterialfv(GL_FRONT, GL_AMBIENT, mat_ambient);
  glMaterialfv(GL_FRONT, GL_DIFFUSE, mat_diffuse);
  glMaterialfv(GL_FRONT, GL_SPECULAR, mat_specular);
  glMaterialf(GL_FRONT, GL_SHININESS, high_shininess);
  glMaterialfv(GL_FRONT, GL_EMISSION, no_mat);
}

5. Что самое главное для освещения? Правильно, нормали :lol:
Примерно так, неидеально конечно:
Раскрывающийся текст
void GLWidget::paintGL()
{  
  makeCurrent();

  glClearColor(.0, 0.0, .0, 1);
  glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

  glColor4f (1.0, 1.0, 1.0, 1.0);
  glMatrixMode(GL_PROJECTION);
  glLoadIdentity();
  glFrustum(-1, 1, -1, 1, 10, 100);
  glTranslatef(0.0f, 0.0f, -15.0f);
  glMatrixMode(GL_MODELVIEW);
  glLoadIdentity();
  glViewport(0, 0, width(), height());
  

  const int w = logo.width();
  const int h = logo.height();
  
  glRotatef(rot_x, 1.0f, 0.0f, 0.0f);
  glRotatef(rot_y, 0.0f, 1.0f, 0.0f);
  glRotatef(rot_z, 0.0f, 0.0f, 1.0f);
  glScalef(scale/w, scale/w, scale/w);

  glTranslatef(-w+1, 0, 0.0f);

  for(int j=0; j < h-1; ++j)
  {

    glBegin(GL_TRIANGLE_STRIP);
    for(int i=0; i < w-1; ++i)
    {
      double x = i;
      double y = j;
      GLfloat v1[] = {0,0,0};
      GLfloat v2[] = {0,0,0};
      {
        GLfloat xx = x*2;
        GLfloat zz = y*2;
        int wi = y*w + x;
        GLfloat yy = wave[wi];
        glVertex3f(xx, yy, zz);
        v1[0] -= xx;
        v1[1] -= yy;
        v1[2] -= zz;
      }

      x = i+1;
      y = j;
      {
        GLfloat xx = x*2;
        GLfloat zz = y*2;
        int wi = y*w + x;
        GLfloat yy = wave[wi];
        glVertex3f(xx, yy, zz);
        v1[0] += xx;
        v1[1] += yy;
        v1[2] += zz;
        v2[0] -= xx;
        v2[1] -= yy;
        v2[2] -= zz;
      }

      x = i;
      y = j+1;
      {
        GLfloat xx = x*2;
        GLfloat zz = y*2;
        int wi = y*w + x;
        GLfloat yy = wave[wi];
        glVertex3f(xx, yy, zz);
        v2[0] += xx;
        v2[1] += yy;
        v2[2] += zz;
      }
      GLfloat normal[] = {v1[1]*v2[2] - v2[2]*v1[1], v1[2]*v2[0] - v1[0]*v2[2], v1[0]*v2[1]- v1[1]*v2[0]};
      glNormal3fv (normal);
      x = i+1;
      y = j+1;
      {
        GLfloat xx = x*2;
        GLfloat zz = y*2;
        int wi = y*w + x;
        GLfloat yy = wave[wi];
        glVertex3f(xx, yy, zz);
      }
    }
    glEnd();

  }  
  //restoreGLState();
}

6. Что почитать?
http://math.hws.edu/graphicsnotes/c4/s3.html (секция 4.3.4 очень рекомендуется)
http://www.glprogramming.com/red/chapter05.html
http://devernay.free.fr/cours/opengl/materials.html например.
7. Можно еще покрутить коэффициенты, но чтобы была реалистичная сталь, придется делать отражение (cube map например). Ну или текстуру.
ltise,
22.2.2013, 11:20 Проблема с консольным приложением
printf ("Enter the length of file name:");

:lol:
А если серьезно то лучше использовать QTextStream:
QTextStream str (stdin);

fileName1 = str.readLine ();
x-8973,
14.2.2013, 14:55 QScrollArea
w->setMinimumSize (100, 50*100 + 20);


Из документации:
Цитата
If a standard QWidget is used for the child widget, it may be necessary to call QWidget::setMinimumSize() to ensure that the contents of the widget are shown correctly within the scroll area.
demaker,
5.2.2013, 14:22 код ошибки -1073741819
Так, а ларчик просто открывался :lol:
Все падает в ~CCOMTRADE, когда удаляются неинициализированные
    if(TimeDataVector != NULL) delete[] TimeDataVector;
    if(AnalogDataVector != NULL) delete[] AnalogDataVector;
    if(DigitalDataVector != NULL) delete[] DigitalDataVector;


Лечится добавлением в конструктор
TimeDataVector = NULL;
AnalogDataVector = NULL;
DigitalDataVector = NULL;


Но вообще Алексей1153 дело говорит.
И еще поменьше new/delete, а вместо них побольше QVector-ов.
demaker,
4.2.2013, 16:08 код ошибки -1073741819
То же самое.
Plot* plot = new Plot(c.Filename,c.type,c.channel_num,this);

Здесь plot становится дочерним виджетом widget, потом удаляется deleteLater, потом второй раз удаляется при удалении widget (т.к. входит в иерархию QObject-ов)

Надо удалить deleteLater.
Напомнило анекдот
"-Доктор, мне больно когда я вот-так делаю.
-Не делайте так. Следующий!"
:lol:
demaker,
1.2.2013, 15:17 сигналы и слоты
Не работает?
demaker,
1.2.2013, 10:42 QTreeWidgetItem
А для этого нужен (еще один) конструктор
explicit TreeWidgetItem(QTreeWidget*parent = 0);

Кстати небольшая поправка
explicit TreeWidgetItem(QTreeWidgetItem*parent = 0);

Здесь нельзя писать =0, потому что нет конструктора QTreeWidgetItem который принимает 0 в качестве parent.

edit:
Опередили .)
Все таки вместо QWidget* лучше использовать QTreeWidget*.
demaker,
29.1.2013, 16:54 Qt+OpenGL. Qt "не видит" функции OpenGL
Поставил Qt5. Подтверждаю, у меня тоже не видит .)

Смотреть почему - http://qt-project.org/forums/viewthread/22821 (от 20 декабря)

Цитата
OK that is the source of your issues then. The pre-compiled Windows desktop version of Qt5 is built against ANGLE which only provides OpenGL ES 2 support by implementing it on top of DirectX 9.
This was done to ensure that QtQuick2 works on all windows systems, including those with crappy Intel OpenGL drivers ;)
OpenGL ES 2 does not support the legacy fixed function pipeline, only a shader-based one.
There is a bug open to provide a build of Qt 5 using the native desktop OpenGL implementation for Qt 5.0.1. Please go vote for https://bugreports.qt-project.org/browse/QTBUG-28715 to see this happen.
For now, you have two choices:
Live with OpenGL ES 2 support and don’t use legacy OpenGL
Build your own copy of Qt 5 to use the native OpenGL drivers by passing in

-opengl desktop

to configure.

With the 2nd option you should have access to OpenGL from 1.0 up to 4.3 (if your card/driver support it).

Суть вкратце:
1. Устанавливаемая собранная версия Qt собрана с использованием OpenGL ES, чтобы QtQuick 2 мог работать на всех системах с Windows.
2. Как я уже говорил OpenGL ES не поддерживает многих старых функций fixed pipeline, только шейдеры, только хардкор .)
3. Можно проголосовать за десктопную сборку для 5.0.1 по ссылке https://bugreports.qt-project.org/browse/QTBUG-28715 , но пока ее нет.
4. Собственно есть два пути
Отказаться от старых функций и использовать только шейдеры.
Или собрать Qt с использованием нативного OpenGL (используя опцию -opengl desktop)
Christor,

5 страниц V  « < 3 4 5
RSS Текстовая версия Сейчас: 22.1.2021, 12:42