Russian Qt Forum

Qt => Пользовательский интерфейс (GUI) => Тема начата: izoomer от Ноябрь 05, 2006, 22:19



Название: динамически создавать виджет.
Отправлено: izoomer от Ноябрь 05, 2006, 22:19
Как такое сделать в qt 4.2. Linux. ?
Читаю оглавление директории. Требуется по количеству файлов в прочитаном каталоге (не постоянное количество файлов, может варьироваться) создавать столько же кнопок и на каждую кнопку определить сигнал на выполнение именно того файла с которого создана кнопка. Вопрос именно в динамическом создании неопределенного количества кнопок (или других виджетов) и каждой со своим слотом.
Спасибо.


Название: динамически создавать виджет.
Отправлено: Dendy от Ноябрь 05, 2006, 22:32
Можно сделать один слот для всех кнопок. А от кого пришёл сигнал получать через QObject::sender():

Код:
QString file_name = ...;
QPushButton * button = new QPushButton( ... );
button->setProperty( "_file_name", file_name );
connect( button, SIGNAL(clicked()), SLOT(button_clicked()) );
...
void MyClass::button_clicked()
{
  QString file_name = sender()->property( "_file_name" );
}


Можно для каждой кнопки создавать свой обьект, которьІй будет принимать сигнал. В етом же обьекте будет храниться имя файла:

Код:
QString file_name = ...;
MyHandler * handler = new MyHandler;
handler->file_name = file_name;
QPushButton * button = new QPushButton( ... );
connect( button, SIGNAL(clicked()), handler, SLOT(button_clicked()) );


Название: динамически создавать виджет.
Отправлено: izoomer от Ноябрь 05, 2006, 22:40
Спасибо.
А каким образом будут отличаться имена объектов, т.е. как отличить затем кнопки , имена то у всех не смогут быть button , нужно ведь как то типа
button_1
button_2
button_3
и так далее ... или я что то не так понимаю ?


Название: динамически создавать виджет.
Отправлено: Dendy от Ноябрь 05, 2006, 22:46
Всё зависит от того, что нужно получить в итоге.


Название: динамически создавать виджет.
Отправлено: QCasper от Ноябрь 05, 2006, 22:58
Цитата: "izoomer"
Спасибо.
А каким образом будут отличаться имена объектов, т.е. как отличить затем кнопки , имена то у всех не смогут быть button , нужно ведь как то типа
button_1
button_2
button_3
и так далее ... или я что то не так понимаю ?


можешь названиями файлов задавать, это вообще сугубо на твое усмотрение


Название: динамически создавать виджет.
Отправлено: izoomer от Ноябрь 06, 2006, 00:09
а как сделать что бы каждая новая создаваемая кнопка имела имя сходное с имененем файла ?
то есть в цикле просматриваем директорию и получаем имя файла и создаем кнопку
QPushButton * filename(...);
как так сделать ?


Название: динамически создавать виджет.
Отправлено: QCasper от Ноябрь 06, 2006, 00:28
Цитата: "izoomer"
а как сделать что бы каждая новая создаваемая кнопка имела имя сходное с имененем файла ?
то есть в цикле просматриваем директорию и получаем имя файла и создаем кнопку
QPushButton * filename(...);
как так сделать ?


эхх... вот Вам пища для размышления, а дальше юз ассистант:
Код:

const char* path = "yourdir";

QDir dir(path);
dir.setFilter(QDir::Files);
QStringList fileList = dir.entryList();

QVBoxLayout *lt = new QVBoxLayout(this);

foreach(QString fileName, fileList) {
    QPushButton *btn = new QPushButton(fileName, this);
    connect(btn, SIGNAL(clicked()), this, SLOT(onClick()));
    lt->addWidget(btn);
}


P.S. А вообще мне сдается (сугубо мое субъективное мнение), что у Вас ошибка на стадии проектирования. Попахивает плохим стилем. Может расскажете, что хотите сделать?


Название: динамически создавать виджет.
Отправлено: izoomer от Ноябрь 06, 2006, 10:57
хочу создавать меню динамическое из кнопок по количеству файлов в директории и на каждую кнопку назначить выполнение каждого файла. Кнопки разместить в один столбец.

добавлено спустя 23 минуты:

 сделал.
А как теперь программно фокус переводить по кнопкам созданным таким образом ?


Название: динамически создавать виджет.
Отправлено: QCasper от Ноябрь 06, 2006, 14:56
Цитата: "izoomer"
А как теперь программно фокус переводить по кнопкам созданным таким образом ?


void QWidget::setFocus ( Qt::FocusReason reason )

в зависимости от чего нужно фокус устанавливать?