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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: QGraphisView + QWidget  (Прочитано 6035 раз)
shadow
Гость
« : Май 20, 2013, 12:02 »

Здравствуйте! Сильно не пинайте я новичок в Qt да и в С++.
Имеется программка для вывода графических объектов, добавил боковую панель для переключателей, теперь я хочу сделать, чтобы при выборе radioButton1 или radioButton2 появлялись разные groupBox (groupBox 2 или groupBox3) для этого я просто хочу скрывать их groupBox2,3->hide();, но при нажатии на 1 или 2  программа вешается  Злой.
Может быть так вообще нельзя делать? Помогите пожалуйтся разобраться....

Код:
DiagramWindow::DiagramWindow()
{    
    createToolBox();
    scene = new QGraphicsScene(0, 0, QApplication::desktop()->width(), QApplication::desktop()->height());
    QHBoxLayout *layout = new QHBoxLayout;
    layout->addWidget(toolBox);
    view = new QGraphicsView(scene);
    layout->addWidget(view);
    QWidget *widget = new QWidget;
    widget->setLayout(layout);
    ....
    setCentralWidget(widget);
}
void DiagramWindow::createToolBox()
{    
    QGridLayout *layout = new QGridLayout;

    QGroupBox *groupBox1= new QGroupBox;
    QGroupBox *groupBox2= new QGroupBox;
    QGroupBox *groupBox3= new QGroupBox;
    groupBox1->setTitle(codec->toUnicode("Параметр"));
    groupBox2->setTitle(codec->toUnicode("Показать"));
    groupBox3->setTitle(codec->toUnicode("Показать"));
    QRadioButton *radioButton1 = new QRadioButton;
    QRadioButton *radioButton2 = new QRadioButton;
    radioButton1->setChecked(true);
    radioButton1->setText("1");
    radioButton2->setText("2");
    QVBoxLayout *vbox1 = new QVBoxLayout;
    vbox1->addWidget(radioButton1);
    vbox1->addWidget(radioButton2);
    vbox1->addStretch(1);
    groupBox1->setLayout(vbox1);
    layout->addWidget(groupBox1);

    QRadioButton *radioButton3 = new QRadioButton;
    QRadioButton *radioButton4 = new QRadioButton;
    QRadioButton *radioButton5 = new QRadioButton;
    QRadioButton *radioButton6 = new QRadioButton;
    QRadioButton *radioButton7 = new QRadioButton;
    QRadioButton *radioButton8 = new QRadioButton;
    radioButton3->setChecked(true);
    radioButton3->setText(codec->toUnicode("Расчет1"));
    radioButton4->setText(codec->toUnicode("Расчет2"));
    radioButton5->setText(codec->toUnicode("Расчет3"));
    radioButton6->setText(codec->toUnicode("Расчет4"));
    radioButton7->setText(codec->toUnicode("Расчет5"));
    radioButton8->setText(codec->toUnicode("Расчет6"));
    QVBoxLayout *vbox2 = new QVBoxLayout;
    vbox2->addWidget(radioButton3);
    vbox2->addWidget(radioButton4);
    vbox2->addWidget(radioButton5);
    vbox2->addWidget(radioButton6);
    vbox2->addWidget(radioButton7);
    vbox2->addWidget(radioButton8);
    vbox2->addStretch(1);
    groupBox2->setLayout(vbox2);
    layout->addWidget(groupBox2);        
    QRadioButton *radioButton9 = new QRadioButton;
    QRadioButton *radioButton10= new QRadioButton;
    QRadioButton *radioButton11= new QRadioButton;
    QRadioButton *radioButton12= new QRadioButton;
    QRadioButton *radioButton13= new QRadioButton;
    QRadioButton *radioButton14= new QRadioButton;
    radioButton9->setChecked(true);
    radioButton9->setText(codec->toUnicode("Измерение1"));
    radioButton10->setText(codec->toUnicode("Измерение2"));
    radioButton11->setText(codec->toUnicode("Измерение3"));
    radioButton12->setText(codec->toUnicode("Измерение4"));
    radioButton13->setText(codec->toUnicode("Измерение5"));
    radioButton14->setText(codec->toUnicode("Измерение6"));
    QVBoxLayout *vbox3 = new QVBoxLayout;
    vbox3->addWidget(radioButton9);
    vbox3->addWidget(radioButton10);
    vbox3->addWidget(radioButton11);
    vbox3->addWidget(radioButton12);
    vbox3->addWidget(radioButton13);
    vbox3->addWidget(radioButton14);
    vbox3->addStretch(1);
    groupBox3->setLayout(vbox3);
    layout->addWidget(groupBox3);

    layout->setRowStretch(3, 10);
    layout->setColumnStretch(1, 10);

    connect(radioButton1, SIGNAL(clicked(bool)), this, SLOT(Toggled_1()));
    connect(radioButton2, SIGNAL(clicked(bool)), this, SLOT(Toggled_2()));

    QWidget *itemWidget = new QWidget;
    itemWidget->setLayout(layout);    

    toolBox = new QToolBox;
    toolBox->setSizePolicy(QSizePolicy(QSizePolicy::Maximum, QSizePolicy::Ignored));
    toolBox->setMinimumWidth(itemWidget->sizeHint().width());  
    toolBox->addItem(itemWidget, tr(""));

}
void DiagramWindow::Toggled_1()
{
groupBox3->hide();

}

void DiagramWindow::Toggled_2()
{
  groupBox2->hide();
}

« Последнее редактирование: Май 20, 2013, 13:56 от shadow » Записан
kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4747



Просмотр профиля WWW
« Ответ #1 : Май 20, 2013, 16:16 »

можно запустить в дебаге и посмотреть что там происходит. также можно выложить готовый проект, а не огрызок, чтобы можно было запустить самому.
Записан

Изучением C++ вымощена дорога в Qt.

UTF-8 has been around since 1993 and Unicode 2.0 since 1996; if you have created any 8-bit character content since 1996 in anything other than UTF-8, then I hate you. © Matt Gallagher
shadow
Гость
« Ответ #2 : Май 21, 2013, 09:39 »

Отправляю весь проект...
Записан
kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4747



Просмотр профиля WWW
« Ответ #3 : Май 21, 2013, 11:10 »

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

ты в createToolBox() насоздавал кучу локальных переменных и думаешь, что они волшебным образом перекочуют в поля класса?

P.S. QMAKE_CXX = gcc — жестоко.
« Последнее редактирование: Май 21, 2013, 11:12 от kambala » Записан

Изучением C++ вымощена дорога в Qt.

UTF-8 has been around since 1993 and Unicode 2.0 since 1996; if you have created any 8-bit character content since 1996 in anything other than UTF-8, then I hate you. © Matt Gallagher
shadow
Гость
« Ответ #4 : Май 21, 2013, 12:05 »

Спасибо за оперативный ответ!
Но я же написал что, сильно не пинайте я новичок в Qt да и в С++.

Цитировать
обычно указателям на объект выделяют память прежде, чем к ним обращаться. твои групбоксы — не исключение.
можно ткнуть носом, а то я чето недоганяю.

Цитировать
ты в createToolBox() насоздавал кучу локальных переменных и думаешь, что они волшебным образом перекочуют в поля класса?
то есть надо все переменные типа QGroupBox, QRadioButton, QGridLayout, QVBoxLayout перенести в diagramwindow.h?

Цитировать
P.S. QMAKE_CXX = gcc — жестоко.
а какая разница если g++?
Записан
Vladimir
Крякер
****
Offline Offline

Сообщений: 305



Просмотр профиля
« Ответ #5 : Май 21, 2013, 15:28 »

Спасибо за оперативный ответ!
Но я же написал что, сильно не пинайте я новичок в Qt да и в С++.

Цитировать
ты в createToolBox() насоздавал кучу локальных переменных и думаешь, что они волшебным образом перекочуют в поля класса?
то есть надо все переменные типа QGroupBox, QRadioButton, QGridLayout, QVBoxLayout перенести в diagramwindow.h?

Да. в .h файле объявляешь указатель на элемент QGroupBox, QRadioButton, QGridLayout, QVBoxLayout.., а в .cpp выделяешь для него память. добавь в .pro файл QT += qt и подключи #include <QtGui> в diagramwindow.cpp. а то половина элементов не видит.
Записан
shadow
Гость
« Ответ #6 : Май 21, 2013, 15:44 »

Цитировать
добавь в .pro файл QT += qt и подключи #include <QtGui> в diagramwindow.cpp. а то половина элементов не видит.
Я использую Qt 5.0.1 QT += widgets хватает.....

Цитировать
а. в .h файле объявляешь указатель на элемент QGroupBox, QRadioButton, QGridLayout, QVBoxLayout.., а в .cpp выделяешь для него память
блин я же так и делаю??? что не так???
Записан
Vladimir
Крякер
****
Offline Offline

Сообщений: 305



Просмотр профиля
« Ответ #7 : Май 21, 2013, 15:54 »

Цитировать
добавь в .pro файл QT += qt и подключи #include <QtGui> в diagramwindow.cpp. а то половина элементов не видит.
Я использую Qt 5.0.1 QT += widgets хватает.....

Цитировать
а. в .h файле объявляешь указатель на элемент QGroupBox, QRadioButton, QGridLayout, QVBoxLayout.., а в .cpp выделяешь для него память
блин я же так и делаю??? что не так???

Ну у вас к примеру и в .h, и .cpp  QRadioButton *radioButton3, radioButton4, radioButton5..; зачем дублировать? объявлять только в .h, если планируется глобальное использование! а так получается объявили глобально, а память выделили локально в функии совсем другому объекту, но с тем же именем, а обращаетесь к глобальному объекту под который естественно память не была веделена. просто внимательно пересмотрите код) 
Записан
shadow
Гость
« Ответ #8 : Май 21, 2013, 16:03 »

Спасибо большое!!! Дейтсвительно ткнул носом....
Вот это затупил....
Записан
kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4747



Просмотр профиля WWW
« Ответ #9 : Май 21, 2013, 16:10 »


Цитировать
P.S. QMAKE_CXX = gcc — жестоко.
а какая разница если g++?

у меня вот например не g++, поэтому мне пришлось закомментировать эту строчку. если kit нормально сконфигурирован в креаторе, то не надо явно указывать компилятор в .pro

в заголовочный файл надо выносить не всё подряд, а лишь те объекты, которые тебе реально понадобятся по ходу дела.
Записан

Изучением C++ вымощена дорога в Qt.

UTF-8 has been around since 1993 and Unicode 2.0 since 1996; if you have created any 8-bit character content since 1996 in anything other than UTF-8, then I hate you. © Matt Gallagher
shadow
Гость
« Ответ #10 : Ноябрь 22, 2013, 12:26 »

Подскажите еще...
Если я добавлю например 100 обектов и уменьшу окно, как сделать чтобы обекты влезли в новое окно?
Нужно перерисовывать обекты с учетом нового размере окна или маштабировать? Как правильно?
Я тут попробывал так:

Код:
bool DiagramWindow::eventFilter(QObject *, QEvent *event)
{
    if(event->type() == QEvent::Resize )
    {          
        view->fitInView(scene->sceneRect(), Qt::KeepAspectRatio);          
        return true;
    }    
    return false;
}
При маштабировании окна все вроде ок кроме номеров (как то плохо матабируются и толщина линий)

« Последнее редактирование: Ноябрь 25, 2013, 15:28 от shadow » Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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