[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?
-
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? -
Niepotrzebnie aż tak to komplikować.
@
// nagłówek
class ObjectLabel : public QLabel
{
Q_OBJECTpublic 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
-
Hehe, dzięki :) Miło, że się udało. Powodzenia dalej!