[SOLVED] QLabel i niedziałające label->setText...



  • Witam, natrafiłem na problem podobny do tego opisanego w pierwszym poście tego wątku:

    http://qt-project.org/forums/viewthread/15774

    @#include <QtGui>

    int main( int argc, char** args )
    {
    QApplication app( argc, args );

    QLabel *label = new QLabel;
    label->setText( "Ready." );

    QPushButton *button = new QPushButton;
    button->setText( "Change text" );
    QObject::connect( button, SIGNAL( clicked() ), label, SLOT( setText( "Boo!" ) ) );

    QHBoxLayout *layout = new QHBoxLayout;
    layout->addWidget( button );
    layout->addWidget( label );

    QMainWindow *mainWindow = new QMainWindow;
    QWidget *centralWidget = new QWidget;
    centralWidget->setLayout( layout );
    mainWindow->setCentralWidget( centralWidget );
    mainWindow->show();

    return app.exec();
    }
    @

    jak sprawić by to zadziałało? próbowałem pisząc osobną funkcję (sygnały i sloty - tyle samo parametrów)

    @void button_clicked() { label->setText("Boo!") }
    @

    ale to nie działa. gdzie leży problem?


  • Moderators

    Z wyjątkiem nowej składni i funkcji Lambda w połączeniach, nie wolno przekazywać żadnych parametrów do Slotu przy deklaracji połączenia. Kod wyjkonawczy musi znajdować się w samej funkcji slotu, lub sygnał musi byc wysłany z odpowiednimi danymi.

    Twoje podejście z button_clicked() jest dobre, jedyny błąd jest taki, że MOC nigdy nie skanuje pliku main.cpp na obecność meta-kodu. Musisz przenieść tą metodę do oddzielnego pliku nagłówkowego, najlepiej do własnej klasy dziedziczącej po QObject, inaczej Meta Object System po prostu nie wie, że istnieje taki Slot.



  • Hmm.. coś takiego?

    @
    class ObjectLabel;
    class myDialog: public QDialog
    {
    Q_OBJECT
    friend class ObjectLabel;
    public:
    myDialog();
    private:
    QPushButton *button;

    };

    class ObjectLabel : public QObject
    {

    Q_OBJECT
    
    friend class Dialog;
    

    public:
    ObjectLabel(const QString&);
    QLabel* poka_label() { return label1; }
    private:
    QLabel *label1;
    private slots:
    void button_clicked()
    {
    if(poka_label()->text() !="Boo")
    {
    label1->setText("Boo");
    }
    }
    };
    @

    potem w konstruktorze okna:
    @
    QVBoxLayout *mainL = new QVBoxLayout(this);
    button = new QPushButton("ChangeText");

    ObjectLabel *lab = new ObjectLabel("nic");
    
    mainL->addWidget(button);
    
    mainL->addWidget(lab);
    this->setLayout(mainL);
    

    connect(OK, SIGNAL(clicked()), label, SLOT(ObjectLabel::button_clicked() ) );
    @

    próbowałem w ten sposób, jednak nie działa metoda mainL->addWidget(lab) , gdy próbuję
    dodać do layoutu obiekt klasy ObjectLabel.
    próbowałem inaczej - dziedziczyć po QWidget, bo wtedy mainL->addWidget(lab) jakoś działa, jednak program tego labela nie wyświetla. czy w takim razie trzeba dziedziczyć po dwóch klasach?


  • Moderators

    Niepotrzebnie aż tak to komplikować.
    @
    // nagłówek
    class ObjectLabel : public QLabel
    {
    Q_OBJECT

    public slots:
    void buttonClicked();
    };

    // źródełko:
    ObjectLabel::buttonClicked() {
    if (text() != "Boo")
    setText("Boo");
    }

    // main.cpp
    int main( int argc, char** args )
    {
    QApplication app( argc, args );

    ObjectLabel *label = new ObjectLabel;
    label->setText( "Ready." );

    QPushButton *button = new QPushButton;
    button->setText( "Change text" );
    QObject::connect(button, SIGNAL( clicked() ), label, SLOT( buttonClicked()));

    // ...
    @



  • Dzięki za podpowiedź, na początku label był w osobnym oknie, dodałem funkcję QLabel * all_acess { return labela; } , by jako widżet dodać bezpośrednio label, a nie ten obiekt,
    i wszystko działa.

    SIerdzio, jesteś gość :D


  • Moderators

    Hehe, dzięki :) Miło, że się udało. Powodzenia dalej!


Log in to reply
 

Looks like your connection to Qt Forum was lost, please wait while we try to reconnect.