Important: Please read the Qt Code of Conduct - https://forum.qt.io/topic/113070/qt-code-of-conduct

QPushButton.click должен изменять мой QLabel



  • У меня есть два объекта класса Counter: A, B. Когда я изменяю значение А, то B также автоматически меняется следом. Есть две кнопки для + (увеличения) и -(уменьшения) значения счётчика. Я реализовала это так:

    main.cpp:
    QObject::connect(&a, &Counter::changeValue, &b, &Counter::setValue);
    QObject::connect(Add, &QPushButton::clicked, &a, &Counter::Increment);
    QObject::connect(Sub, &QPushButton::clicked, &a, &Counter::Decrement );
    

    У меня есть два объекта QLabel, которые показывают значение объектов класса Counter.
    Дело в том, что при нажатии на кнопки каждый раз текст QLabel должен обновляться, должно происходить что-то вроде этого:

    QLabel object->setText(QString("NEW VALUE"));
    

    Пыталась делать различными способами, результата нет. Подскажите, как правильно добавить действие при клике, и чтобы это было рационально.


  • Qt Champions 2019

    @Regex_brave said in QPushButton.click должен изменять мой QLabel:

    Пыталась делать различными способами

    Pokazhi kak imenno



  • @jsulm

    main.cpp:
    Counter A, B;
    QObject::connect(&A, &Counter::changeValue, &B, &Counter::setValue);
    QObject::connect(&A, &Counter::changeValue, &B, &Counter::Increment);
    QObject::connect(&A, &Counter::changeValue, &B, &Counter::Decrement );    
    
    
    QObject::connect(Add, &QPushButton::clicked, &A, &Counter::clickedAdd(QLabel* obj));
    QObject::connect(Sub, &QPushButton::clicked, &B, &Counter::clickedSub(QLabel* obj));
    
    
    class Counter: public QObject{
    private: 
    int count;
    public slots:
    int Increment () {
    count++;
    emit changeValue(count);
    }
    int Decrement () {
    count--;
    emit changeValue(count);
    }
    void clickedAdd(QLabel* obj){
    int new_count = Increment();
    obj_label->setText(QString::number(new_count));_
    }
    void clickedSub(QLabel* obj){
    int new_count = Deccrement();
    obj_label->setText(QString::number(new_count));_
    }
    void setValue(int new_count){
    m_count = new_count;
    emit changeValue(new_count);
    }
    public signals:
    void changeValue(int);
    

  • Qt Champions 2019

    @Regex_brave said in QPushButton.click должен изменять мой QLabel:

    QObject::connect(Add, &QPushButton::clicked, &A, &Counter::clickedAdd(QLabel* obj)); // Pochemu QLabel* obj?
    QObject::connect(Sub, &QPushButton::clicked, &B, &Counter::clickedSub(QLabel* obj)); // I zdes'

    > QObject::connect(Add, &QPushButton::clicked, &A, &Counter::clickedAdd);
    > QObject::connect(Sub, &QPushButton::clicked, &B, &Counter::clickedSub); // Pochemu B?
    


  • @jsulm

    QObject::connect(Add, &QPushButton::clicked, &A, &Counter::clickedAdd(QLabel* obj));
    QObject::connect(Sub, &QPushButton::clicked, &A, &Counter::clickedSub(QLabel* obj));
    QObject::connect(Add, &QPushButton::clicked, &B, &Counter::clickedAdd(QLabel* obj));
    QObject::connect(Sub, &QPushButton::clicked, &B, &Counter::clickedSub(QLabel* obj));
    

    Это не работает, так как на clickedAdd, clickedSub пишет следующее:
    call to non-static member function without an object argument
    Хотя в качестве аргумента передаю указатель на объект QLabel текущий


  • Qt Champions 2019

    @Regex_brave

    QObject::connect(Add, &QPushButton::clicked, &A, &Counter::clickedAdd(QLabel* obj));
    QObject::connect(Sub, &QPushButton::clicked, &A, &Counter::clickedSub(QLabel* obj));
    

    Mne ne ponjatno zachem QLabel* obj ? Eto voobshe ne dolzhno buildit'.

    U clicked jest' "bool checked" parameter: https://doc.qt.io/qt-5/qabstractbutton.html#clicked



  • @jsulm
    так работает, если вручную набрать:
    QLabel* Obj = ... ;
    a.clickedAdd(Obj);

    А когда передаю в connect'e - нет.


  • Qt Champions 2019

    @Regex_brave said in QPushButton.click должен изменять мой QLabel:

    А когда передаю в connect'e - нет.

    Potomushto v connecte s novym sintaksom tipy ne ukazywajutsja:

    QObject::connect(Add, &QPushButton::clicked, &A, &Counter::clickedAdd);
    QObject::connect(Sub, &QPushButton::clicked, &A, &Counter::clickedSub);
    


  • @Regex_brave said in QPushButton.click должен изменять мой QLabel:

    int Decrement () {
    ...
    int new_count = Deccrement();

    Decrement vs. Deccrement (c/cc) ? :)



  • @jsulm Но со старым синтаксисом это компилируется, но не работает:

    QObject::connect(Add, SIGNAL(clicked()), &A, SLOT(clickedADD(firstObject));
    


  • @Regex_brave said in QPushButton.click должен изменять мой QLabel:
    Old syntax:

    SLOT(clickedADD(firstObject))

    -> SLOT(clickedAdd(QLabel*))



  • @JonB мой firstObject является QLabel*, указателем типа QLabel



  • @Regex_brave
    Is your firstObject a variable or a type? It looks like a variable!?

    But that is not how the old syntax for SLOT() worked!
    E.g. https://woboq.com/blog/new-signals-slots-syntax-in-qt5.html

    Here is how you would connect a signal to a slot:
    connect(sender, SIGNAL(valueChanged(QString,QString)), receiver, SLOT(updateValue(QString)) );

    SLOT(updateValue(QString)): QString here is a type not a variable.

    Translate:

    Ваш firstObject - это * переменная * или * тип *? Похоже на * переменную * !?
    Vash firstObject - eto * peremennaya * ili * tip *? Pokhozhe na * peremennuyu * !?

    Но не так работал старый синтаксис для SLOT ()!
    No ne tak rabotal staryy sintaksis dlya SLOT ()!

    SLOT (updateValue (QString)): QString здесь * тип *, а не * переменная *.
    SLOT (updateValue (QString)): QString zdes' * tip *, a ne * peremennaya *.

    В любом случае, на ваше усмотрение, может я неправильно понял
    V lyubom sluchaye, na vashe usmotreniye, mozhet ya nepravil'no ponyal

    :)



  • @JonB Ok, but what if use lambda function? How is it look like?



  • @Regex_brave
    Use lambdas (new style syntax) e.g. if you want to pass different parameters from signal to slot. Example:

    // member variables QPushButton *pb1, *pb2
    pb1 = new QPushButton(this);
    pb1->setObjectName("PushButton #1");
    pb2 = new QPushButton(this);
    pb2->setObjectName("PushButton #2");
    
    connect(pb1, &QPushButton::clicked, this, &MainWindow::pushButtonClicked);
    connect(pb2, &QPushButton::clicked, this, &MainWindow::pushButtonClicked);
    
    connect(pb1, &QPushButton::clicked, this, []() { qDebug() << "A button was clicked, but *still* do not know which button"; });  // lambda
    connect(pb2, &QPushButton::clicked, this, []() { qDebug() << "A button was clicked, but *still* do not know which button"; });  // lambda
    
    connect(pb1, &QPushButton::clicked, this, [this]() { pushButtonClicked(pb1); });  // lambda
    connect(pb2, &QPushButton::clicked, this, [this]() { pushButtonClicked(pb2); });  // lambda
    
    void MainWindow::pushButtonClicked(bool checked = false)
    {
        qDebug() << "A button was clicked, but do not know which button";
    }
    
    void MainWindow::pushButtonClicked(QPushButton *pb)
    {
        qDebug() << "Button was clicked, objectName:" << pb->objectName();
    }