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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: Добавление кнопки на виджет  (Прочитано 4655 раз)
Ovoshlook
Гость
« : Сентябрь 19, 2010, 16:22 »

Суть проблемы не настолько тривиальна как звучит тема)):

Есть TabWidget.

При создании вкладки на ней создается Widget, на Widget'e создается компоновщик и кнопка в нем (в компоновщике), которая добавляет объект на данную вкладку (ну собсвтенно в компоновщик, как все поняли).

Если я создаю вкладку и работаю с кнопкой- то она создает объект именно на этой вкладке, которая активна, но как только я переключаю вкладку и работаю на переключенной то возникает проблема:

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

Код С++

void CTF::CreateNewTab() //непосредственно создаю вкладку
{

    Global::k++;
    


     MainTabWidget=new QWidget ;
     TabLayout=new QGridLayout;

    QString v = QString::number(Global::k);

    BoxOfQ->addTab(MainTabWidget,v);//BoxOfQ это сам TabWidget
    BoxOfQ->setCurrentWidget(MainTabWidget); //Ставлю Виджет на TabWidget как активный.

    MainTabWidget->setLayout(TabLayout);
}

void CTF::CreateQOnTab(int)// Создаются объекты на вкладке TabWidget'a

{
     ObektiNaWidgete(); //немного подсократил. Оставил саму суть. С помощью этой функции создаются объекты. Функия описана ниже

connect (BoxOfQ, SIGNAL (currentChanged(int)),this, SLOT (currentTab(int))); //соединяю сигнал об изменении активной вкладки со
                                                                                                             слотом передачи активности тому виджету, который
                                                                                                             находится на активной вкладке (currentTab(int) будет
                                                                                                             описана ниже)


void CTF::ObektiNaWidgete()// Создание объектов на Widget'e
{
    QuochtTextEdit=new QTextEdit;

    AddNewAnsverVariant= new QPushButton (this);

    TabLayout->addWidget( QuochtTextEdit,1,1,6,3);
    TabLayout->addWidget( AddNewAnsverVariant,7,3,1,1);

    connect (AddNewAnsverVariant, SIGNAL (clicked()),this ,SLOT(createNewAnsverVariant())); //Сигнал, соединяющий кнопку для
                                                                                                                                   создания объекта на Widget'e со
                                                                                                                                    слотом который эту кнопку создает.
}


void CTF::currentTab(int)// слот передачи активности тому виджету, который находится на активной вкладке
{
    w=BoxOfQ->currentWidget();
}

void CTF::createNewAnsverVariant()// здесь в общем (не вдаваясь в подробности) создается окошко для создания объекта на widget
{
  
  BoxOfQ->setCurrentWidget(w);//после изменения вкладки делаю активным widget той вкладки,которая сейчас активна

  Form=new dialog_addNewAnsverVariant(this);
  Form->show();

  connect (Form->AddAnsverButton,SIGNAL (clicked()), this, SLOT (addNewVariantAnsver())); //связываю сигнал по нажатию кнопки в
                                                                                                                                  окошке,  со слотом создания объекта
                                                                                                                                  на widget'e

}

void CTF::addNewVariantAnsver()  //собственно создание объекта на widget'e активной вкладки
{
    
    NewVariant=new QRadioButton;
    

    TabLayout->addWidget(NewVariant,Global::i,1,1,1); //добавляю созданный объект на widget в компановщик.
    Form->close();
    
    Global::i++;
}

Так и не понимаю в чем у меня промах- если есть у кого идеи подскажите. Заранее всем спасибо.
« Последнее редактирование: Сентябрь 19, 2010, 16:27 от Ovoshlook » Записан
kibsoft
Хакер
*****
Offline Offline

Сообщений: 625


Просмотр профиля WWW
« Ответ #1 : Сентябрь 19, 2010, 17:42 »

в TabLayout у тебя хранится указатель на последний созданный компоновщик. Поэтому должно быть так:

Код:
void CTF::addNewVariantAnsver()  //собственно создание объекта на widget'e активной вкладки 
{
   
    NewVariant=new QRadioButton;
   

    BoxOfQ->currentWidget()->layout()->addWidget(NewVariant,Global::i,1,1,1); //добавляю созданный объект на widget в компановщик.
    Form->close();
   
    Global::i++;
}

P.S. ObektiNaWidgete() - этой полный капец)) никогда не пишите транслитом..
createNewAnsverVariant() - тут как я понял, вы попытались блеснуть английским Улыбающийся правильно Answer
И еще - названия переменных тоже жесть, попытайтесь давать осмысленные имена, а не набор букв.
Записан

http://kibsoft.ru - Download the Qt Media Encoding Library here

The apps that were written using QtMEL:
http://srecorder.com - Screen recording software
Ovoshlook
Гость
« Ответ #2 : Сентябрь 19, 2010, 18:41 »

Да я транслитом и не пишу) просто тут (на форуме) написал чтобы понятнее было, потомк что моя функция там совсем по другому назывется)) Ну и с английским у меня тяжко немного) А с переменными-то мне так удобнее)) так привык.

По сабжу:

Спасибо огромное!!)) Усе работает, только проблемка одна для layout()->addWidget(Widget* widget) не определена перегруженная функция (ну там где можно задавать координаты виджета на сетке. Оно и понятно почему: layout это родитель GridLayout как я понимаю) но все таки может есть возможность каким нить образом переопределить addWidget так чтобы можно было работать с координатами сетки??
« Последнее редактирование: Сентябрь 19, 2010, 18:48 от Ovoshlook » Записан
kibsoft
Хакер
*****
Offline Offline

Сообщений: 625


Просмотр профиля WWW
« Ответ #3 : Сентябрь 19, 2010, 21:13 »

Код:
QGridLayout *layout = static_cast<QGridLayout*>(BoxOfQ->currentWidget()->layout());
layout->BoxOfQ->currentWidget()->layout()->addWidget(NewVariant,Global::i,1,1,1);
Записан

http://kibsoft.ru - Download the Qt Media Encoding Library here

The apps that were written using QtMEL:
http://srecorder.com - Screen recording software
Ovoshlook
Гость
« Ответ #4 : Сентябрь 25, 2010, 16:34 »

Давно не появлялся) Времени не было. Спасибо вам большое, хот и запоздалое за помощь. ОЧень ценю)

Только снова проблема. При вышеописаном приведении типов компилятор ругается о том что BoxOfQ Не является членом класса QGridLayout... Не совсем понятно почему? вроде бы приведено к типу было...

З.Ы. Не подумайте что думать лень и тому подобное, просто я новичок в с++, и некоторые вещи еще не до конца понимаю. Но я стараюсь) правда)
« Последнее редактирование: Сентябрь 25, 2010, 16:52 от Ovoshlook » Записан
kibsoft
Хакер
*****
Offline Offline

Сообщений: 625


Просмотр профиля WWW
« Ответ #5 : Сентябрь 25, 2010, 17:01 »

Цитировать
о том что BoxOfQ Не является членом класса QGridLayout
Так BoxOfQ - это TabWidget в вашем коде..
Записан

http://kibsoft.ru - Download the Qt Media Encoding Library here

The apps that were written using QtMEL:
http://srecorder.com - Screen recording software
Ovoshlook
Гость
« Ответ #6 : Сентябрь 25, 2010, 17:07 »

Ой) Усе понял просто вместо вот этого как у вас в примере:

layout->BoxOfQ->currentWidget()->layout()->addWidget(NewVariant,Global::i,1,1,1);

Написал

layout->addWidget(NewVariant,Global::i,1,1,1);

К типу ведь привели вот этот отрезок  BoxOfQ->currentWidget()->layout()

Все заработало. Спасибо вам огромное еще раз) Заодно попрактиковался сприведением типов) Просто не сталкивался с этим еще) вот и затупил))

Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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