crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )

> Несколько слотов на 1 кнопке
AD
  опции профиля:
сообщение 22.5.2009, 15:24
Сообщение #1


Профессионал
*****

Группа: Участник
Сообщений: 2003
Регистрация: 4.2.2008
Из: S-Petersburg
Пользователь №: 84

Спасибо сказали: 70 раз(а)




Репутация:   17  


Помогите, пожалуйста, разобраться в следующей ситуации.
Есть кнопка открытия COM-порта. После того, как COM-порт открыт, название кнопки изменяется с "Open" на "Close"! Ну и соответственно при следующем нажатии надо попадать в слот закрытия порта. Как это сделать корректно?

Вот маленький кусок кода:
/// Класс главного окна программы
class ImitatorTSL: public QMainWindow, public Ui::ImitatorTSLClass
{
    Q_OBJECT

private:
    bool isPortNumEmpty();
    int numberPort();
    char* stringPort();

public slots:
    void openPort();
    void closePort();
};

ImitatorTSL::ImitatorTSL(QWidget *parent, Qt::WFlags flags): QMainWindow(parent, flags)
{
    setupUi(this);

    connect(btnPortWorking, SIGNAL(clicked()), this, SLOT(openPort()));
    connect(btnPortWorking, SIGNAL(clicked()), this, SLOT(closePort()));
}

ImitatorTSL::~ImitatorTSL() {}

/// Проверка edit-поля номера порта на пустоту
bool ImitatorTSL::isPortNumEmpty()
{
    if(linePort -> text().isEmpty())
    {
        QMessageBox message(QMessageBox::Critical, QString("Error"), QString("Number of port must not to empty"),
                            QMessageBox::Ok, this);
        message.exec();
        return true;
    }
    return false;
}

/// Возвращает номер порта (если есть неполадки, то -1)
int ImitatorTSL::numberPort()
{
    bool ok;
    int port = linePort -> text().toInt(&ok);
    if(!ok)
    {
        QMessageBox message(QMessageBox::Critical, QString("Error"), QString("Number of port isn't correct"),
                            QMessageBox::Ok, this);
        message.exec();
        return -1;
    }

    return port;
}

/// Получение строкового значения порта
char* ImitatorTSL::stringPort()
{
    int port = numberPort();
    if(port == -1) return "error";
    string port_str(QString(QString("COM") + QString::number(port)).toStdString());
    char *char_numport = new char[port_str.size() + 1];
    memcpy(char_numport, port_str.c_str(), port_str.size());
    char_numport[port_str.size()] = 0;

    return char_numport;
}

/// Открытие порта COM
void ImitatorTSL::openPort()
{
    if(isPortNumEmpty()) return;
    char *char_numport = stringPort();
    if(!_stricmp(char_numport, "error")) return;

    COMPort comPort;
    bool init = comPort.init(::CreateFile(char_numport, GENERIC_READ | GENERIC_WRITE,
        0,        // comm devices must be opened w/exclusive-access
        0,    // no security attributes
        OPEN_EXISTING, // comm devices must use OPEN_EXISTING
        0,        // not overlapped I/O
        0    // hTemplate must be NULL for comm devices
        ));
    if(!init)
    {
        DWORD error = ::GetLastError();
        QMessageBox message(QMessageBox::Critical, QString("Error"), QString("Error number %1").arg(error),
                            QMessageBox::Ok, this);
        message.exec();
        return;
    }
    btnPortWorking -> setText("Close");
}

/// Закрытие COM-порта
void ImitatorTSL::closePort()
{
    char *char_numport = stringPort();
    if(!_stricmp(char_numport, "error")) return;
}
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

Сообщений в этой теме


Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0




RSS Текстовая версия Сейчас: 20.4.2024, 5:57