Старый 26.08.2010, 17:18   #1
POS_troi
 
Аватар для POS_troi
 
Регистрация: 06.07.2010
Сообщений: 98
Репутация: 35
По умолчанию [Решено]Динамически создаваемые кнопки[QT]

Пишу программку, смысл её в том что парсится xml файл в котором прописаны пути к программам которые должны запускаться по нажатию кнопки.

Код:
<Programm name="Gedit" patch="/usr/bin/gedit" icon="gedit.ico" title="Запускает текстовый редактор">
Каждую кнопку создаю сразу после получения очередных данных с xml

Код:
void MainWindow::ReadXml()
{

    QString title,ico,patch,name;
    QFile file("a.xml");
    file.open(QIODevice::ReadOnly);

    QXmlStreamReader XmlRead(&file);
    while(!XmlRead.atEnd())
    {
            XmlRead.readNext();
            if (XmlRead.isStartElement())
               if (XmlRead.name()=="Programm")
              {
                    title   =      XmlRead.attributes().value("title").toString();
                    ico     =      XmlRead.attributes().value("icon").toString();
                    patch   =      XmlRead.attributes().value("patch").toString();
                    name    =      XmlRead.attributes().value("name").toString();

                    ShowElements(name, ico, title, patch);

              }
    }

  
}

void MainWindow::ShowElements(QString name, QString icon, QString title, QString patch)
{
   
    QPushButton *button = new QPushButton(name,this);
    QObject::connect(button,SIGNAL(clicked()),this,SLOT(StartProgramm(Сюда нужно передать параметр)));
    button->show();

}
Все работает отлично за исключением обработки "Слота" кнопки, то-есть у меня есть функция
Код:
void MainWindow::StartProgramm(QString ProgramPatch)
{

    QProcess *process = new QProcess();
    process->start(ProgramPatch);
    
}
Которая и должна была послужить "слотом" для кнопки но как я понял в слот нельзя напрямую передать параметр (в моем случае patch из xml).

Вопрос - как реализовать динамическое создание слотов? Я почитал доки но что-то не совсем въехал в технологию.

Извиняюсь если как-то неясно описал проблему, в коментах если что уточню )

Сам спросил сам и отвечу

Код:
QSignalMapper * signalMapper = new QSignalMapper(this);
    QPushButton *button[buttons];


    button[buttons] = new QPushButton(name,this);
    signalMapper->setMapping(button[buttons],QString(patch));
    connect(button[buttons], SIGNAL(clicked()),signalMapper, SLOT (map()));
    connect(signalMapper, SIGNAL(mapped(const QString &)),this, SLOT(StartProgramm(const QString &)));
Для этого дела хорошо помогает QSignalMapper

Последний раз редактировалось POS_troi; 26.08.2010 в 22:07.. Причина: Решил задачу
POS_troi вне форума   Ответить с цитированием
Старый 25.11.2010, 16:15   #2
Suicide Silence
 
Аватар для Suicide Silence
 
Регистрация: 25.11.2010
Сообщений: 1
Репутация: 0
По умолчанию

Искал такой же варинт только на делфи
Suicide Silence вне форума   Ответить с цитированием
Старый 09.12.2011, 01:27   #3
POS_troi
 
Аватар для POS_troi
 
Регистрация: 06.07.2010
Сообщений: 98
Репутация: 35
По умолчанию

Великая сила форума.
Обыскал весь комп на предмет исходника данного лончера.
Решил уже писать с нуля и опять наткнулся на туже проблему. Первой ссылкой гугла был Rdot - опять ответил сам себе
POS_troi вне форума   Ответить с цитированием
Ответ

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход



Powered by vBulletin® Version 3.8.5
Copyright ©2000 - 2020, Jelsoft Enterprises Ltd. Перевод: zCarot