LINUX.ORG.RU

Передача виджета.


0

0

Есть обьект класса A производный от QWidget. Есть класс B, так же производный от QWidget, в котором, суествует обьект Vector класса QPtrList. Так вот, в обьекте класса A создаётся кнопка. Затем этот обьект передаётся классу B который в свою очередь добавляет этот обьект в Vector, с ним в Vector'е делается reparent, resize, это надо, что бы сменить родителя обьекта A (родитель 0, т.е. дефолт) на класс B, т.е. родителем А становиться B.Так вот, на поверхности обьекта класса A не видно кнопки (как я понял это связано с reparent), но она точно созданна, однако, если кнопку добавить не в классе А а в классе В сразу после вставки обьекта класса А в Vector и последующего reparent'а, то кнопку видно. Кнопка в обоих случаях создаётся одним способом. Вопрос, почему кнопка созданная в классе А не видна при переносе обьекта класса А в обьект класса В, а кнопка созданна в обьекте класса В но с указанием родителя обьекта класса А, видна.

Код:

*************************************************************
QWidget *t = new QWidget; <--- не работает ни с этим
kmmsPlaylist *pl = new kmmsPlaylist("TEST"); <--ни с этим
pl->addItem("test","test");

kmmsPlaylist *pl1 = new kmmsPlaylist("TEST");
pl1->addItem("test","test");

controlw->createTabs(scin->controlheader, scin->controlaheader);
controlw->addTab(t);
controlw->setActiveTab(0);

playlistw->createTabs(scin->playlistheader, scin->playlistaheader);
playlistw->addTab(pl);
playlistw->addTab(pl1);
playlistw->setActiveTab(0);
**************************************************************

**************************************************************
class kmmsPlaylist : public QWidget
{
Q_OBJECT

public:

kmmsPlaylist(QString name); //constructor
~kmmsPlaylist(); //destructor

void savePlaylist(); //write playlist to hdd
void loadPlaylist(); //read playlist from hdd
QString* name(){return name_playlist;} //name of playlist
void setName(QString name); //set name of playlist

void addItem(QString path_to_file, QString name); //add item to playlist
void removeItem(QString); //remove item from playlist
int numItem(){return num_items;} //num of items in playlist

private:

QString *name_playlist; //name of playlist
int num_items; //num of items
QStringList *str_items; //content of playlist
QPtrList<QLabel> items; //vector of items of list
};
class kmmsPlaylistWindow : public kmmsWindow
{

public:
kmmsPlaylistWindow(int type, int flags, QObject *o); //constructor
~kmmsPlaylistWindow(); //destructor

void createTabs(QPixmap *header, QPixmap *header); //create tabs object
void addTab(QWidget *w); //add tab to tabs
void setActiveTab(int n); //set active tab
void tabsResize(int width, int height); //resize workspace of tabs

void resizePlaylistw(); //resieze playlist window

kmmsTabs *tabs; //tabs object
}
**************************************************************

**************************************************************
void kmmsPlaylistWindow::createTabs(QPixmap *header, QPixmap *aheader)
{
QPixmap *tmp = new QPixmap(*this->space->backgroundPixmap());

tabs = new kmmsTabs(0, 0, this->space->width(), this->space->height(), tmp, space);

tmp = new QPixmap(*this->space->backgroundPixmap());
tabs->setSpacePix(tmp);

tabs->setHeaderPix(header, aheader);

delete tmp;
}

void kmmsPlaylist::addItem(QString path, QString name)
{
items.append (new QLabel(this));
items.at(num_items)->show();
num_items++;

QLabel *l = new QLabel(this);
l->show();
l->resize(100,100);
l->move(0,0);
l->setText(name);
}

**************************************************************

**************************************************************

void kmmsTabs::addTab(QWidget *tab)
{
header.append (new kmmsTabHeader(this, num_tabs));
header.at(num_tabs)->move(num_tabs*(headerXSize + 2)+3,4);
header.at(num_tabs)->resize(headerXSize, headerYSize);
if (headerPix) header.at(num_tabs)->setBackgroundPixmap(*headerPix);

connect (header.at(num_tabs),SIGNAL(clicked(int)),this,SLOT(setActiveTab(int)));

space.append (new QWidget(tab));
space.at(num_tabs)->reparent(this,QPoint(0,headerYSize + 10));
space.at(num_tabs)->resize(width(),height() - (headerYSize + 5));
if (spacePix) space.at(num_tabs)->setBackgroundPixmap(*spacePix);

num_tabs++;
}

**************************************************************

А вот если так

**************************************************************

void kmmsTabs::addTab(QWidget *tab)
{
header.append (new kmmsTabHeader(this, num_tabs));
header.at(num_tabs)->move(num_tabs*(headerXSize + 2)+3,4);
header.at(num_tabs)->resize(headerXSize, headerYSize);
if (headerPix) header.at(num_tabs)->setBackgroundPixmap(*headerPix);

connect (header.at(num_tabs),SIGNAL(clicked(int)),this,SLOT(setActiveTab(int)));

space.append (new QWidget(tab));
space.at(num_tabs)->reparent(this,QPoint(0,headerYSize + 10));
space.at(num_tabs)->resize(width(),height() - (headerYSize + 5));
if (spacePix) space.at(num_tabs)->setBackgroundPixmap(*spacePix);

QPushButton *b = new QPushButton(space.at(num_tabs));

num_tabs++;
}

**************************************************************

т.е. добавить

QPushButton *b = new QPushButton(space.at(num_tabs));

то, кнопка появляется, на нужен именно первый вариант.

Заранее спасибо!!!

★★★★★

Поразительное по своей сумбурности описание проблемы.

>Есть обьект класса A производный от QWidget.
> это надо, что бы сменить родителя обьекта A
Вы все-таки разберитесь, A - это класс или объект?

И зачем обязательно сначала создавать кнопку в одном месте, а потом ее передавать куда-то для reparent-а, что мешает сразу создать ее в нужном месте?

phoenix ★★★★
()
Ответ на: комментарий от phoenix

Так в том то и дело что надо имнно так, т.е. это что типа плагина что ли будет. Т.е. так надо.

А вот почему это не работает я кажется понял, ща проверю.

cyclon ★★★★★
() автор топика
Ответ на: комментарий от cyclon

Мдаа, видимо ошибся. Короче я думал что проблемма в преобразованнии типа в QWidget

void kmmsTabs::addTab(QWidget *tab)

стало

void kmmsTabs::addTab(kmmsWidget *tab)

который соответственно не имеет ни кнопок ни лэйблов. Я решил сделать ещё один класс kmmsWidget а в нём сделал QPtrVector из лэйблов, но это не сработало :(

cyclon ★★★★★
() автор топика
Ответ на: комментарий от cyclon

Если Вы выделите минимальный неработающий код и запостите его сюда с форматированием, понять в чем проблема будет гораздо проще ;)

phoenix ★★★★
()
Ответ на: комментарий от phoenix

> Если Вы выделите минимальный неработающий код и запостите его сюда с форматированием, понять в чем проблема будет гораздо проще ;)

Минимальный я привёл, да и форматирование то же есть.

cyclon ★★★★★
() автор топика
Ответ на: комментарий от cyclon

Можно подумать, нам это нужно.

anonymous
()
Ответ на: комментарий от cyclon

В код не вникал, но что если попробовать передавать в reparent(widget, position, TRUE), т.е. указывать явным образом необходимость вызова show() после reparent

phoenix ★★★★
()

Кстати, проект kmms уже существует - kmms.sf.net

anonymous
()

> Так вот, в обьекте класса A создаётся кнопка.

В объектах ничего не создается, создается в методах какого-либо объекта.

>QPushButton *b = new QPushButton(space.at(num_tabs));

>num_tabs++;

>}

>**************************************************************

>т.е. добавить

>QPushButton *b = new QPushButton(space.at(num_tabs));

>то, кнопка появляется, на нужен именно первый вариант.

А где она по-вашему раньше создавалась?

anonymous
()
Ответ на: комментарий от anonymous

Пардон немного не то сморозил, т.е. смысл не поменялся, но... вообщем там где оно должно создаваться там лэйбл

void kmmsPlaylist::addItem(QString path, QString name)
{
items.append (new QLabel(this)); <-----
items.at(num_items)->show(); <-----
num_items++;

QLabel *l = new QLabel(this); <-----
l->show(); <-----
l->resize(100,100); <-----
l->move(0,0); <-----
l->setText(name); <-----
}

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

cyclon ★★★★★
() автор топика
Ответ на: комментарий от phoenix

> В код не вникал, но что если попробовать передавать в reparent(widget, position, TRUE), т.е. указывать явным образом необходимость вызова show() после reparent

Так тут как раз надо вникнуть (без обид), дело в том что сам виджет виден, не видно его содержимого, т.е. того что в нём строиться, в данном случае в виджете строится лэйбл, но его не видно, а виджет виден.

cyclon ★★★★★
() автор топика
Ответ на: комментарий от anonymous

Ну пардон, ну смысл тот же. Ещё раз извиняюсь, ибо не по злому умыслу, а по... короче попутал :)

cyclon ★★★★★
() автор топика
Ответ на: комментарий от cyclon

Да ничего не безвыходная, просто в твоем коде разобраться невозможно. Дохрена всего левого. Советую написать для начала __небольшой__ тестовый примерчик и запостить его сюда целиком

anonymous
()
Ответ на: комментарий от anonymous

кто ясно мыслит, тот ясно излагает.

вывод: cyclon мыслит коряво!
Без обид, ок?

подозреваю, что у человека с логикой напряженка.

anonymous
()
Ответ на: комментарий от anonymous

Ну я конечно не обижаюсь, но в чём кривизна или корявость, может всё таки обьяснишь, я постараюсь исправить, но то что я привёл в качестве кода - это отрывок кода программы, может поэтому и кажется криво.

По поводу создания отдельного примера я уже подумывал, напишу как только так сразу :))

cyclon ★★★★★
() автор топика
Ответ на: комментарий от cyclon

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

cyclon ★★★★★
() автор топика
Ответ на: комментарий от cyclon

Я думал буду дольше писать :))

Вот код, минимальный пример.

main.cpp
/*********************************************************************/
#include "test.h"

int main(int argc, char **argv)
{
	QApplication app ( argc, argv );
	test *t = new test;
	app.setMainWidget(t->mw());
	t->init();
	return app.exec();
}
/*********************************************************************/

test.h
/*********************************************************************/
#ifndef _TEST_H_
#define _TEST_H_

#ifdef HAVE_CONFIG_H
#include <config.h>
#endif

#include "inc.h"
#include "testwindow.h"
#include "testtabs.h"

/**
 * @short Application Main Window
 * @author test <alexandr@cyclon>
 * @version 0.1
 */

class test
{
public:

	test();
	virtual ~test();

	QWidget* mw();
	void init();

	testWindow *w;
	testTabs *tab;
};

#endif // _TEST_H_
/*********************************************************************/

test.cpp
/*********************************************************************/
#include "test.h"

test::test()
{
	w = new testWindow();
	w->show();

	tab = new testTabs();
}

test::~test()
{
}

QWidget* test::mw()
{
	return w;
}

void test::init()
{
	w->add(tab);
}

#include "test.moc"
/*********************************************************************/

testtabs.h
/*********************************************************************/
#ifndef TESTTABS_H
#define TESTTABS_H

#include "inc.h"

/**
@author test
*/
class testTabs : public QWidget
{
	Q_OBJECT

public:

	testTabs(QWidget *parent = 0, const char *name = 0);
	~testTabs();

	QPushButton *b;
};

#endif
/*********************************************************************/

testtabs.cpp
/*********************************************************************/
#include "testtabs.h"

testTabs::testTabs(QWidget *parent, const char *name)
 : QWidget(parent, name)
{
	b = new QPushButton(this);
	b->show();
}


testTabs::~testTabs()
{
}


#include "testtabs.moc"
/*********************************************************************/

testwindow.h
/*********************************************************************/
#ifndef TESTWINDOW_H
#define TESTWINDOW_H

#include "inc.h"
#include "testtabs.h"

/**
@author test
*/

class testWindow : public QWidget
{
	Q_OBJECT

public:

	testWindow(QWidget *parent = 0, const char *name = 0);
	~testWindow();

	void add(testTabs* tab);

};

#endif
/*********************************************************************/

testwindow.cpp
/*********************************************************************/
#include "testwindow.h"

testWindow::testWindow(QWidget *parent, const char *name)
 : QWidget(parent, name)
{
}


testWindow::~testWindow()
{
}

void testWindow::add(testTabs* tab)
{
	tab->reparent(this, QPoint(0,0));
        tab->show();
}

#include "testwindow.moc"

/*********************************************************************/

Краткое описание.
Создаётся виджет (окно) класса testWindow - w, далее создаётся элемент
класса testTabs - tab, с нулевым родителем. Затем с помощью функции 
add в классе testWindow в w добавляется tab. В классе testTabs есть 
кнопка, которая в этом же классе становится видимой b->show().

Но после передачи tab в w, кнопка почему то видна :( !?

cyclon ★★★★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.