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

Войти
 
  Начало Форум WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  
  Просмотр сообщений
Страниц: 1 2 3 [4]
46  Qt / Вопросы новичков / Re: Масштабирование и прокрутка графиков по отдельности : Август 22, 2017, 11:52
Не пойму, как тут прозрачный фон помогает...
QLayout уже не модно ? Улыбающийся
Проблема в том, что при использовании QLayout  мне не удалось установить прозрачность виджета QOpenGLWidget , он отображается с черным фоном, хоть ты тресни. А вот если виджеты поместить на сцену, то прозрачность есть.
Я работаю в Qt три недели, возможно чего-то еще не понимаю, поэтому заранее прошу меня извинить за все глупости. Улыбающийся
Мои графики имеют несколько сотен тысяч значений, занимают всю область окна и пересекаются друг с другом во множестве мест. Перерисовать отдельную область не получится. Поэтому изначально хотелось реализовать систему слоев, чтобы работать с каждым графиком отдельно в своем слое(масштабировать, изменять промежутки отображения) и не перерисовывать остальные. Задача поставлена реализовать в OpenGL. Поэтому и использую виджеты QOpenGLWidget с прозрачным фоном.  Прозрачность устанавливаю с помощью
Код:
setWindowOpacity(0.9); 
в конструкторе и
  
Код:
  QOpenGLFunctions *f = QOpenGLContext::currentContext()->functions();
    f->glClearColor(0, 0, 0, 0);
в initializeGL().
Еще одна проблема - масштабирование всего окна приводит к скачкообразному масштабированию всех слоев - виджетов. После многочисленных экспериментов прихожу к выводу, что проблема в  QOpenGLWidget. Если взять и положить простые виджеты QWidget друг на друга:
Код:
chart::chart(QWidget *parent) :
    QDialog(parent),
    ui(new Ui::chart)
{
    ui->setupUi(this);

    //Создаем первый виджет
    QWidget* topWidget=new QWidget(this);

    //layout, который кладется на само диалоговое окно
    QVBoxLayout* curLayout=new QVBoxLayout;
    curLayout->addWidget(topWidget);
    setLayout(curLayout);

    //layout, который кладется на первый виджет
    curLayout=new QVBoxLayout;
    topWidget->setLayout(curLayout);


    for (int i = 0; i<10; i++)
    {
        //Создать очередной виджет
        QWidget* w=new QWidget(this);
        topWidget=w;
        curLayout->addWidget(w);

        //Назначить виджету фон
        QPalette pall;
        pall.setColor(w->backgroundRole(), Qt::blue);
        w->setPalette(pall);
        w->setAutoFillBackground(true);

        //Создать на виджете layout
        curLayout=new QVBoxLayout;
        w->setLayout(curLayout);
    }
}

chart::~chart()
{
    delete ui;
}
Масштабирование окна выполняется идеально. Но если в этом же коде заменить QWidget на QOpenGLWidget то при масштабировании уже можно заметить скачкообразность и фон остается черным. А если заменить на QGLWidget, то при масштабировании эффект вас потрясет... Улыбающийся

 
47  Qt / Вопросы новичков / Re: Масштабирование и прокрутка графиков по отдельности : Август 21, 2017, 19:45
В результате на сцену кладу массив виджетов QOpenGLWidget с прозрачным фоном и размер каждого устанавливаю равным размеру формы. Все хорошо, графики отображаются, но при растягивании формы масшабирование виджетов выполняется скачками  Грустный.
48  Qt / OpenGL / Re: Как установить цвет рисунка в QOpenGLWidget? : Август 21, 2017, 17:43
glColorMask - задает маску, а не цвет. цвет задается glColor3f(0.5, 0.5, 0.5); или аналоги
Спасибо! Улыбающийся
49  Qt / OpenGL / Как установить цвет рисунка в QOpenGLWidget? : Август 21, 2017, 11:45
Всем привет! Надеюсь, у вас все хорошо Улыбающийся
В виджете, который является потомком QOpenGLWidget, рисую линию. Для установки цвета в paintGL() использую:    
Код:
QOpenGLFunctions *f = QOpenGLContext::currentContext()->functions();
        f->glColorMask(0, 1, 0, 1); // задаем цвет графика
В результате цвет могу установить либо красный, либо синий, либо зеленый (еще черный и белый). А как установить другой цвет? Например, серый... Как в QGLWidget:
Код:
QColor lightGray = QColor(Qt::gray).light(180);
qglColor(lightGray );
50  Qt / Вопросы новичков / Масштабирование и прокрутка графиков по отдельности : Август 15, 2017, 14:14
Мне нужно отобразить несколько графиков в одном окне. Надо иметь возможность масштабировать и прокручивать графики по отдельности. Для отображения одного графика использую QGLWidget. А как теперь лучше отобразить графики вместе? На ум приходит положить несколько QGLWidget (в каждом нарисован свой график) с прозрачным фоном друг на друга. Или лучше использовать сцену с графическим представлением? Или что-то еще? Посоветуйте...
51  Qt / Вопросы новичков / Re: Изменение элементов контейнеров : Август 10, 2017, 12:48
CChannel & ch = ..
Спасибо! Улыбающийся
52  Qt / Вопросы новичков / Изменение элементов контейнеров : Август 10, 2017, 12:30
   Читаю текстовый файл. Каждая строка файла содержит некоторые значения через запятую. N-ое значение относится к n-му каналу. Надо разнести значения по каналам.
         
Код:
QStringList lWordsList = row.split ( ",", QString::SkipEmptyParts );
           for(int j=0;j<lWordsList.size();j++)
           {
                   CChannel ch=(CChannel)channelList[j] ;//Здесь создается копия элемента CChannel
                   double val=lWordsList[j].toDouble();
                   ch.valueList.insert(dt,val);
                   channelList[j]=ch;//пытаюсь внести изменения в список и здесь программа начинает дико тормозить
           }
   row - очередная строка из файла. QMap<int, CChannel> channelList - список каналов CChannel. У CChannel есть список значений QMap <QDateTime, double> valueList. Когда пишу
 
Код:
 CChannel ch=(CChannel)channelList[j]; 
   оказывается создается копия  элемента CChannel, и все, что я делаю с этой копией никак не влияет на реальный элемент  в списке каналов channelList. Поэтому после всех изменений копии, присваиваю ее j-му  элементу списка. Все вроде работает, но проблема в том, что на операторе 
Код:
channelList[j]=ch;

программа начинает дико тормозить. Без этого оператора 10-мегабайтный файл считывается за 3 сек, с этим оператором - счет идет на часы. Как решить проблему? Как внести изменения в элемент напрямую? Или что-то еще?
             
53  Qt / Вопросы новичков / Re: Как вызвать виджет из dll : Август 09, 2017, 07:40
Да, решение явно неверное. При попытке запустить dll под отладчиком получаю ошибку: ASSERT failure in QCoreApplication: "there should be only one application object". Подобное описано и здесь. Если в dll передавать QApplication, то тогда непонятно зачем вообще создавать dll. Грустный
54  Qt / Вопросы новичков / Re: Как вызвать виджет из dll : Август 04, 2017, 19:49
Спасибо за исследование! Правда, оно не совсем для новичков... Я вот не совсем поняла, зачем для создания файла в dll создавать отдельный поток и в нем QCoreApplication? Я думала QCoreApplication нужен для того, чтобы отлавливать события, а здесь никаких событий вроде не ожидается...
55  Qt / Вопросы новичков / Re: Как вызвать виджет из dll : Август 04, 2017, 19:11
Точно! И если изменить pr():

Код:
void Test::pr() //Метод который вызывается при нажатии кнопки в основном приложении
{
    Window w;
    w.show();
    pApp->exec();
}

То все работает! Спасибо огромное!
56  Qt / Вопросы новичков / Как вызвать виджет из dll : Август 04, 2017, 12:30
Здравствуйте!
Работаю в Qt Creator 4.3.1, на Qt 5.9.1 Использую компилятор  MinGW 5.3 (Windows10 64x).
Мне нужно при нажатии кнопки в основном приложении вызвать виджет из dll.
Создала dll. Ниже привожу экспортируемый класс Test. Если конструктор класса оставить пустым, то при нажатии на кнопку появляется ошибка: QWidget: Must construct a QApplication before a QWidget.  А если в конструкторе класса создаю объект QApplication, то при компиляции dll появляется ошибка: invalid use of incomplete type 'class QApplication.
Если в dll нельзя создавать QApplication, то как правильно вызвать виджет из dll? Примеры в сети в основном сделаны на Q4 и предлагают создать QApplication.

Код:
#ifndef TEST_H
#define TEST_H

#include "test_global.h"

class TESTSHARED_EXPORT Test
{

public:
    Test();
    ~Test();
    void pr();
};

#endif // TEST_H

Код:
#include "test.h"
#include "window.h"

QApplication* pApp = NULL;

Test::Test()
{
        int argc=0;
        char *argv[1];
        argv[0]="";
        pApp = new QApplication(argc, argv); //здесь ошибка: invalid use of incomplete type 'class QApplication
}
Test::~Test()
{
   delete pApp;
}

void Test::pr() //Метод который вызывается при нажатии кнопки в основном приложении
{
    Window w;// Это мой виджет
    w.show();
}

Вызов в  основном приложении:
Код:
void MainWindow::on_pushButton_2_clicked()
{
      Test t;
      t.pr();
}
Страниц: 1 2 3 [4]

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