Russian Qt Forum

Qt => Вопросы новичков => Тема начата: Uhbif от Май 06, 2021, 20:14



Название: глобальные и локальные переменные в qt
Отправлено: Uhbif от Май 06, 2021, 20:14
Я новичок, по ссылке http://cs.tealeaf.su/serial-port-gui.html попробовал создать программу для опроса ком-порта. У меня в принципе все получилось, все работает. Теперь немного хочу доработать программу, то есть чтобы таймер не сразу гнал данные в порт, а только после нажатия кнопки, и после нажатия другой соответственно останавливался. Думал сделать это через глобальные переменные. и написал так:
это main.cpp
#include "mainwindow.h"

#include <QApplication>

 int i;
int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    MainWindow w;
    w.show();
    return a.exec();
}

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>

extern int i;


QT_BEGIN_NAMESPACE
namespace Ui { class MainWindow; }
QT_END_NAMESPACE

class MainWindow : public QMainWindow
{
    Q_OBJECT
 в h файле прописал extern, то есть вроде как объявил глобальную переменную.



Дальше


файл mainwindow.cpp

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);

    // создали таймер, привязали его к форме
        // если ругается на QTimer ставим на него курсор и нажимаем Alt+Enter
        // чтоб на автомате добавить #include <QTimer>


        QTimer *timer = new QTimer(this);

        // подключили сигнал timeout, к слоту нажатия на кнопку
        connect(timer, SIGNAL(timeout()), this, SLOT(on_pushButton_4_clicked()));

        // запускаем со значением вызывать раз в 300мс
if(i >0)
{
    timer->stop();
}else
{
    timer->start(300);
}


    foreach (const QSerialPortInfo &serialPortInfo, QSerialPortInfo::availablePorts())
       {
           ui->cmbPort->addItem(serialPortInfo.portName());
       }


}

MainWindow::~MainWindow()
{
    delete ui;
}

здесь подразумеваю что глобальная переменная 0 и программа каждые 300 мс как бы нажимает кнопку и получает данные это все работает.
ниже кнопка.

void MainWindow::on_pushButton_4_clicked() //получение данных с датчика
{

 


    QSerialPort serialPort;

        serialPort.setPortName(this->ui->cmbPort->currentText());
        serialPort.setBaudRate(QSerialPort::Baud9600);

       if (!serialPort.open(QIODevice::ReadWrite)) {
        //    QMessageBox::warning(this, "Ошибка", "Не удалось подключится к порту");
            return;
        }

       serialPort.write("e");
       serialPort.waitForBytesWritten();
        // ВСЕ ЧТО ВЫШЕ ЭТОГО НЕ ТРОГАЕМ

        QByteArray data;  // специальный тип QT для хранения последовательности байтов
        while (serialPort.waitForReadyRead(10)) {
            // вместо холостого чтения накапливаем результат в переменную data
            data.append(serialPort.readAll());
        }

        // добавляем строку с содержимым data в поле txtOutput
        ui->txtData->append(data);
     
        serialPort.close();

}

тут все работает, теперь дальше кнопка остановки

void MainWindow::on_pushButton_5_clicked() //прекращение получения данных
{
   
 i++;

} как я думал, глобальная переменная становится больше на 1 и таймер в соответствии с условием выше должен остановиться.
if(i >0)
{
    timer->stop();
}else
{
    timer->start(300);
}

Но нет как гнал он данные так и гонит. В чем может быть ошибка?
Еще может кто нибудь подсказать как мне очистить окно от полученных данных. То есть по нажатию кнопки?
Возможно вопросы мои наивные но я только начинаю в это входить.