Russian Qt Forum
Апрель 27, 2024, 22:37 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало Форум WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  
  Просмотр сообщений
Страниц: 1 [2] 3
16  Qt / Вопросы новичков / Re: Вывод сообщения в графический интерфейс из другого файла. : Май 25, 2020, 14:49
У тебя MainWindow уничтожается сразу после выхода из функции one.
Ну он же вызывает метод и даже отправляет туда переменную. Как это мешает ui->setText.
17  Qt / Вопросы новичков / Вывод сообщения в графический интерфейс из другого файла. : Май 25, 2020, 14:25
Так, я писал код в рабочую программу, но потом понял, что не получается это сделать. Создал специальный примерочный код.
В нём тоже не получается. Компилятор естественно не показывает ошибок. Даже, если вместо переменной, я вставлю сразу тупо любой текст, он тоже не выведется, но, если дополнить код, отладочным сообщением(cout<<"я работаю"; ), то оно выведется и сразу после ui и после. То есть метод работает и вызывается, но не работает сам вызов setText'а.
.cpp - файл, который хочет вызвать метод, который выведет посланную переменную в интерфейс.
Код:
void one(){
    int i=0;
    MainWindow vivod;
    vivod.vivod_na_ekran(i);
}
Тут, для проверки. я просто в ручную подставлял цифорки в i=... Но чтобы я туда не вёл, это не выведется. Ну то есть сам ui не работает.

mainwindow.cpp - тот самый метод
Код:
void MainWindow::vivod_na_ekran(int i){
    ui->label_2->setText(QString::number(i));
}

Метод я сделал публичным.
Код:
public slots:

    void vivod_na_ekran(int i);
Я делал его и обычным методом, без слотов и в слотах.
Хотя на самом деле пытался и через публичную ui(по одной из подсказок, это называлось ленивым способом), но происходило тоже самое.
18  Qt / Вопросы новичков / Re: Как делать неактивные кнопки? : Май 25, 2020, 13:26
button->setEnabled(false)
Спасибо.
19  Qt / Вопросы новичков / Re: Как делать неактивные кнопки? : Май 25, 2020, 13:25
нда, не нагуглил setEnabled ?
Нет.
20  Qt / Вопросы новичков / Как делать неактивные кнопки? : Май 22, 2020, 17:19
Гуглил как это сделать, максимум что нашёл, это как делать динамические кнопки. Это вроде как то что нужно, но в тамошнем примере создавались кнопки которые будут создавать другие кнопки.

Мне же надо, пока одна кнопка не нажата, две другие были неактивны. Главное чтобы они не удалялись.
21  Qt / Вопросы новичков / Re: Пауза : Май 21, 2020, 23:45
>То есть файлом, можно игнорировать такую вещь, как потоки и передавать послания в любые другие потоки или основной

Угу. А про кеширование файловой системы ты не слышал? Обрабатываешь ситуацию, если файл пустой? А если двое сразу запишут в него что-нибудь?
Это просто пример паузы. Переписывать файл могут только пауза и продолжить(просто в этом примере они активны одновременно, что ошибка).
На счёт игнорирования, я имел ввиду, что можно организовать общение потоков через файловую систему.
Да, тут нету обработок на случай если файл пустой, просто я в маинвиндовс, сразу создаю файл заполненным. Другое дело. если кто то целенаправленно захочет удалить или переписать файл(ну а это ровно тоже самое, если переписать любой файл программы).
22  Qt / Вопросы новичков / Re: Обработать сигналы с qLineEdit. Автоматизировать обработку полей. : Май 21, 2020, 23:15
Цитировать
Блин, проглядел я это. Кстати, юзайте новый стиль коннектов, тогда и проблем будет меньше.

Код
C++ (Qt)
connect (edit, &QLineEdit::textChanged, this, &MainWindow::block_symbols_in_polya)
Даааа, это то что нужно!!! Всё можно закрывать тему.
23  Qt / Вопросы новичков / Re: Обработать сигналы с qLineEdit. Автоматизировать обработку полей. : Май 21, 2020, 23:10
Цитировать
К сожалению код топикстартера не проверял... Но мне показалось не очень корректным, что он создал кучу коннектов, а если "куча полей" пополнится еще парочкой, то придется писать дополнительные коннекты... Вот и привел пример, исключающий эту проблему. На истину в последней инстанции не претендую  Улыбающийся
Да, эта куча полей действительно пополнится новыми полями и как бы коннекты не так страшно было делать(просто копирование/вставка)+ они находятся в одном месте из-за чего их легко редактировать. Просто суть была в том, чтобы избежать создания однотипных методов с одним и тем же действием, вот я и решил свести их до одного метода.
24  Qt / Вопросы новичков / Re: Пауза : Май 21, 2020, 23:01
Если кому нужно, я приложу своё решение проблемы с паузой. Однако, тут я всё ещё не знаю, как реализовать неактивные кнопки(НО я думаю, это тема другой..эмм. темы). Так же, я считаю. что тут единственная дыра, это когда пользователь нажмёт на кнопку во время чтения из файла. С другой стороны, для выхода из паузы, можно придумать один единственный код: какие нибудь 8888, да он пропустит одну итерацию в цикле, но в итоге всё ровно продолжит программу.
.h
Код:
#ifndef THREE_H
#define THREE_H
void start(bool stoper);
#endif // THREE_H
.Cpp
Код:
#include "mainwindow.h"
#include <math.h>

#include <iostream>
using namespace std;

#include <thread> //две библиотеки,
#include <chrono> //для потоков
#include "three.h"
#include <stdlib.h>

void one(bool stoper){
    int i=0;
    char str[10];
    int n=0;
    FILE* fan;


    while(stoper==false){
    cout<<"i="<<i<<endl; i++;
    this_thread::sleep_for(chrono::milliseconds(1500));

      fan=fopen("test.txt","r");
      while(!feof (fan)) {
      if (fgets(str, 10, fan))
       n = atoi(str);
 cout<<"s="<<str<<endl;
 this_thread::sleep_for(chrono::milliseconds(1000));
 cout<<"n="<<n<<endl;
 this_thread::sleep_for(chrono::milliseconds(1000));
    }

  this_thread::sleep_for(chrono::milliseconds(3000));
     if(n==1){
         while(n==1){
             cout<< "pause" << endl;
             this_thread::sleep_for(chrono::milliseconds(1000));
             rewind(fan);
             while(!feof (fan)) {
                 cout<< "@";
             if (fgets(str, 10, fan))
              n = atoi(str);
             cout<<"n in pause="<< n << "pause" << endl;
         }
         }
         cout<< "continue" << endl;
         this_thread::sleep_for(chrono::milliseconds(200));
         }
     //stoper=true;
    }
fclose(fan);
}



void start(bool stoper){
thread th(one,stoper);
th.detach();
}


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

    FILE* fn;
    fn=fopen("test.txt", "w");
    fprintf(fn,"111");
    fclose(fn);
}
Кнопки(Да, я там использовал глобальную переменную, которую и хотел изменять, её по сути можно удалить):
Код:
bool stoper=false;

void MainWindow::on_pushButton_clicked()//старт
{
    if(stoper==false)
    start(stoper);
}

void MainWindow::on_pushButton_2_clicked()//пауза
{   FILE* f;
    f=fopen("test.txt","w");

    if(f == NULL)
        {
            printf("не могу открыть файл '%s'", "test.txt");
        } else


        fprintf(f,"1");
    fclose(f);
}

void MainWindow::on_pushButton_3_clicked()//продолжить
{
    FILE* f;
        f=fopen("test.txt","w");

        if(f == NULL)
            {
                printf("не могу открыть файл '%s'", "test.txt");
            } else


            fprintf(f,"32");
        fclose(f);
}
25  Qt / Вопросы новичков / Re: Пауза : Май 21, 2020, 22:42
Так. В общем, я сделал три кнопки:Пауза, продолжить и старт. Старт запускает программу и она сидит в цикле(пока, не тру), если паузы так и не произошло, то просто выйдет из него поставив тру. По пути она будет считывать файл в котором будет лежать ключ(ну просто код), собственно этот код изменяется нажатием пауза. То есть пауза, просто берёт файл, переписывает его содержимое в единичку(можно сказать что это ключ для паузы). собственно, когда глобальная функция прочтёт из файла единицу, она войдёт в замкнутый цикл.На всякий случай я там оставил таймер. там тоже происходит чтение файла и если была нажата кнопка продолжить, файл пере пишется ну, на любую другую цифру(например 2). То есть файлом, можно игнорировать такую вещь, как потоки и передавать послания в любые другие потоки или основной. Можете назвать это костылём, но это работает идеально, так ещё и оставляет возможность для модификаций, например для сериализации кода(что пригодится для сохранения и загрузки).

В итоге: Пауза и продолжить, просто переписывают по нажатию кнопки текст в файле, а циклы являются скажем так, контрольными точками или чекпоинтами.
26  Qt / Вопросы новичков / Re: Обработать сигналы с qLineEdit. Автоматизировать обработку полей. : Май 21, 2020, 00:42
по тем кусочкам кода, которые видно, все написано правильно. Выкладывай тогда полный проект, может ошибка в другом месте Грустный
Даааа, там очень много кода. Думаю, в итоге легче разобраться просто создавая кучу однотипных методов под каждое поле.

В любом случае, я бы хотел знать, правильно ли я конекты записал(вначале он берёт поле, отслеживая с него сигнал о изменении, в (this), отправляя обрабатывать в слот(block_symbols_in_polya()). Отладчик кстати показал, что у меня тупо не входит в метод (block_symbols_in_polya(). Там не меняются переменные. Единственная причина, это неправильно написанный сендер или инициализация указателя, ну или, он вообще один раз слушает сигналы, сразу на старте программы и забывает про них.
27  Qt / Вопросы новичков / Re: Обработать сигналы с qLineEdit. Автоматизировать обработку полей. : Май 20, 2020, 19:25
если я вместо obj пишу конкретное поле(например lineEdit_1)
на картинке используются не такие простые названия переменных, там всякие Lyner_1_1, может в этом и дело?

и кстати вставлять код текстом куда лучше.
Нет, не в этом. Дело в том, что мы не обращаемся к ui, то есть к графическому интерфейсу. Нужно обратится к ui, от него обратится к конкретному объекту и сделать конкретное дело. В моём случае, я не могу обратится к конкретному объекту, мне нужно чтобы программа сама поняла к какому объекту ей нужно обратится.Я не знаю как ей это дать понять. Я читал документацию и нашёл какой то sender, который по описанию вроде как именно это и делает. Узнал как его использовать. Однако полученный объект не пропускает компилятор. Здесь мне уже успели подсказать. что можно убрать ui. Теперь я понял, что в таком случае, мы будем применять изменения к объекту, которая переменная, а не поле в программе. Такое компилятор пропускает, но такой код не имеет смысла. Вот в чём проблема.
То есть, программа сама должна узнавать, какое поле кинуло сигнал.Для этого я кинул скрин с сигналами, может я не правильно отправляю сигнал, или может сендер не так использую.
28  Qt / Вопросы новичков / Re: Пауза : Май 20, 2020, 16:12
О май гад. Что это за гиганский h. файлы?
29  Qt / Вопросы новичков / Re: Пауза : Май 20, 2020, 16:10
Ну если "без затей" то просто sleep в цикле, напр
Код
C++ (Qt)
void CheckPause( void )
while (pauseFlag)
 QThread::sleep(20);
}
 
И по вставлять эту функцию в тело длинных расчетов. Кнопочка устанавливает переменную pauseFlag. И, кстати, "прерывать" и "останавливать" не одно и то же

Так, то есть, обернуть всю функцию с расчётами в кокон из while(pauseFlag)? На само деле я не знаю что такое pauseFlag. Я к тому, что, нужны ли там библиотеки? И я так подразумеваю, что в итоге пауза будет ставится не сразу по нажатию кнопки, а пока она сигнал не поймает?
30  Qt / Вопросы новичков / Re: Обработать сигналы с qLineEdit. Автоматизировать обработку полей. : Май 20, 2020, 16:05
... (там если что, ограничения для ввода в поля до вещественных чисел).

Если что, то для ограничения ввода в QLineEdit можно использовать QValidator.
Да, я знаю, просто потом планируются необычные ограничения для полей, какие конкретно не знаю, поэтому через него не получится.
Страниц: 1 [2] 3

Страница сгенерирована за 0.097 секунд. Запросов: 23.