Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Вызов сигналов на слот автоматически [Qt] 
V
    Опции темы
BIV
Дата 3.11.2010, 19:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 219
Регистрация: 20.12.2007

Репутация: нет
Всего: 1



Всем доброе время суток!
Мне нужно написать программу, которая будет работать в фоновом режиме. Там не будет ни формы и ни кнопки. Как в таком случае мне автоматически вызывать слот?
PM MAIL   Вверх
BIV
Дата 3.11.2010, 21:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 219
Регистрация: 20.12.2007

Репутация: нет
Всего: 1



Я пытаюсь повторить
Код

#include "myprocess.h"

myProcess::myProcess(QWidget *parent) : QDialog(parent)
{
        sb.setText("start");
        ib.setText("input");
        QVBoxLayout *vl=new QVBoxLayout;
        vl->addWidget(&sb);
        vl->addWidget(&te);
        vl->addWidget(&le);
        vl->addWidget(&ib);
        setLayout(vl);

        connect(&sb,SIGNAL(clicked()),this,SLOT(startProcess()));
        connect(&ib,SIGNAL(clicked()),this,SLOT(doInput()));
        connect(&myProc,SIGNAL(readyReadStandardOutput()),this,SLOT(showOutput()));
        connect(&myProc,SIGNAL(readyReadStandardError()),this,SLOT(showOutput()));
}

void myProcess::startProcess()
{
        QString prog="C:\\WINDOWS\\system32\\cmd.exe";
     //   QString prog="C:\\Qt\\2010.05\\qt\\Forum\\testcon-build-desktop\\release\\testcon.exe";
        myProc.start(prog);
        if(myProc.waitForStarted())
                te.append(QString("Program <b>%1</b> started").arg(prog));
        else
                te.append(QString("Can't start program <b>%1</b>").arg(prog));
}

void myProcess::doInput()
{
        QString s=le.text()+"\n";
        if(myProc.write(s.toAscii())!=-1) le.clear();
}

void myProcess::showOutput()
{
         te.append(QString::fromLocal8Bit(myProc.readAllStandardOutput()));  //Вот этот вывод хочу получить в a
         te.append(QString::fromLocal8Bit(myProc.readAllStandardError()));    //Вот этот вывод хочу получить в b
}



Но только мне не нужна форма и кнопки, полученные данные хочу получить в a и b

        QProcess myProc;
        bool Error;
Код

#include "widget.h"

Widget::Widget(QWidget *parent)
    : QWidget(parent)
{
    //это, допустим, параметры функции
    const char* user="Администратор";
    const char* pass="123";

    //тут собираем строку
    std::string s;

    s+="net user ";
    s+=user;
    s+=" ";
    s+=pass;

    setError(false);
    QString prog="C:\\WINDOWS\\system32\\cmd.exe";
    QProcess myProc;
    myProc.start(prog);
    if(myProc.waitForStarted()){}
    else setError(true);
    QString S;
    for(int i=0;s[i]!=0;i++)S[i]=s[i];
    if(Error==false)
    {
        if(myProc.write(S.toAscii())!=-1){};
    }
    
    connect(&myProc,SIGNAL(readyReadStandardOutput()),this,SLOT(showOutput()));
    connect(&myProc,SIGNAL(readyReadStandardError()),this,SLOT(showOutput()));
}

void Widget::setError(bool mod)
{
        Error = mod;
}

void Widget::showOutput()
{
    QString a,b;
    b=QString::fromLocal8Bit(myProc.readAllStandardOutput());
    a=QString::fromLocal8Bit(myProc.readAllStandardError());
    // te.append(QString::fromLocal8Bit(myProc.readAllStandardError()));
}


PM MAIL   Вверх
null56
Дата 4.11.2010, 04:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 721
Регистрация: 19.3.2008

Репутация: 6
Всего: 12



Цитата(BIV @  3.11.2010,  19:56 Найти цитируемый пост)
Там не будет ни формы и ни кнопки. Как в таком случае мне автоматически вызывать слот? 

я ничо не понял, но попробую ответить
1) если у тебя нет графических элементов и ты хочешь получать реакцию на сигналы в своем классе, то тебе нужно наследоваться от класса QObject
2) автоматический вызов слота - это как? слоты вызываются, как реакция на сигнал, сгенерится сигнал, вызовится слот
Сигналы классов Qt описаны в ассистенте, если ты создаешь свои классы (наследники от QObject), то должен сам объявить и генерить сигналы
Код

class MySignalGenerator : public QObject
{
      Q_OBJECT // обязательно
// ...
// секция объявления сигналов
signals:
       void my_signal();
};
//...
emit my_signal; // для генерации сиганла в нужном месте кода
//..


PM MAIL   Вверх
BIV
Дата 4.11.2010, 14:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 219
Регистрация: 20.12.2007

Репутация: нет
Всего: 1



Попробую пояснить мою задачу
Мне нужно написать клиент, который будет запускаться автоматически при входе в систему. Он должен быть невидим джля пользователя и постоянно поддерживать связь с сервером.
После того как клиент автоматически запустился, нужно сгенерировать пароль и составить строчку для консоля "net user (имя) (пароль)", после чего, отправить его на выполнения в консоль. Но только отправить, этого мало, надо еще получить ответ прошла ли операция или возникла ошибка (например связанная с тем, что нет такого имени).
Выше приведенный пример реализует то, что мне надо,, но проблема в том что форма видима и для выполнения нужно жать кнопки. Чтобы быть правильно понятым, я очень прошу посмотреть ту готовую программу.

Заранее хочу на всякий случай сказать, что строчка main( int argc, char *argv[] ) ну никак не подойдет, так как она работает на запуск, а мне нужно на этапе выполнения программы
PM MAIL   Вверх
BIV
Дата 4.11.2010, 16:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 219
Регистрация: 20.12.2007

Репутация: нет
Всего: 1



Я составил блоксхему работы моего клиента. Там где помечено красным, это то, чего я хочу добиться
user posted image
PM MAIL   Вверх
BIV
Дата 4.11.2010, 21:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 219
Регистрация: 20.12.2007

Репутация: нет
Всего: 1



Вот что-то сдолбал, но выводит пока не то, что нужно. Мне нужно получить сообщение "пароль изменен" или "нет такого пользователя". Что не так?
Код

#include "mainwindow.h"

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
{
    QString prog="C:\\WINDOWS\\system32\\cmd.exe";
    myProc.start(prog);
    if(myProc.waitForStarted()){}
    else
    {
        //Если не удалось
    }

    QString user="Администратор";
    QString pass="123";
    QString S=QString("net user %1 %2").arg(user).arg(pass);
    myProc.write(S.toAscii());
    connect(&myProc,SIGNAL(readyReadStandardOutput()),this,SLOT(showOutput()));
    connect(&myProc,SIGNAL(readyReadStandardError()),this,SLOT(showOutput()));


}

void MainWindow::showOutput()
{
   a=QString::fromLocal8Bit(myProc.readAllStandardOutput());
   b=QString::fromLocal8Bit(myProc.readAllStandardError());
   int r = QMessageBox::warning( this, tr("Inspection"),
                                                   tr("%1 %2").arg(a).arg(b),
                                                   QMessageBox::Yes);
}


Это сообщение отредактировал(а) BIV - 4.11.2010, 21:25
PM MAIL   Вверх
BIV
Дата 4.11.2010, 22:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 219
Регистрация: 20.12.2007

Репутация: нет
Всего: 1



Все, докопался. Вопрос снят
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С/С++: Кроссплатформенное программирование, QT/Gtk+/wxWidgets"
JackYF
Любитель
  • В заголовке темы в квадратных скобках обозначьте используемую вами библиотеку, например: [QT],[GTK],[wx].
  • Если вопрос актуален только для некоторой версии библиотеки, либо, если вы пользуетесь не самой последней версией, укажите это. Например: [QT4], [GTK2].
  • Все начинающие изучать Qt - не забудьте зайти сюда.
  • Проставьте несколько ключевых слов темы, чтобы её можно было легче найти.
  • В вопросе укажите полную версию версию библиотеки, а также все дополнительные используемые программные пакеты.
  • Не забывайте пользоваться кнопкой "Код".
  • Телепатов на форуме нет! Задавайте чёткий, конкретный и полный вопрос. Указывайте полностью ошибки компилятора и компоновщика.
  • Новое сообщение должно иметь прямое отношение к тематике этого раздела. Флуд, флейм, оффтопик запрещены.
  • Категорически запрещается обсуждение вареза, "кряков", взлома программ и т.д.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, Любитель.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | С/С++: Кроссплатформенное программирование, Qt/Gtk+/wxWidgets | Следующая тема »


 




[ Время генерации скрипта: 0.0705 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.