Sygnał i slot w QT - konkretny przypadek.

0

W QT działam od wczoraj, chciałbym połączyć dwa widgety, a mianowicie checkBox-a i lineEdit w taki sposób że, zmiana stanu domyślnego checkBox-a czyli u mnie unchecked spowoduje zmianę stanu kontroli lineEdit z disabled na enabled.
Po prostu aby checkBoxem uaktywniać i dezaktywować widget lineEdit.

1

podłącz checkBox.toggled(bool) do lineEdit.setEnabled(bool)

0

connect(ui->komplet, SIGNAL(toggled(bool)), ui->nr_2, SLOT(setEnabled(bool)));

do klasy checkBox dodałem definicje sygnału :
Q_SIGNALS:
void stateChanged(int);
void toggled(bool);

klasa lineEdit miała już zadeklarowany slot:
public slots:
void setEnabled(bool);

podaczes komppilacji pojawiają się błędy:

C:\ocs\ui_mainwindow.h błąd:undefined reference to _imp___ZN9QLineEdit10setEnabledEb' C:\ocs\ui_mainwindow.h:97: błąd:undefined reference to _imp___ZN9QLineEdit10setEnabledEb'

1

E,nie tak.Zakładając iż masz zrobione to pod Designerem:
1.CheckBox już ma zdefiniowany sygnał toggled i podobne,nie musisz robić swojego.
2.W Designerze przełącz się na tryb łączenia sygnałów i slotów (to takie spore guziki na button barze u góry,po tooltipie zobaczysz który dokładnie to)
3.Metodą drag&drop narysuj strzałkę od checkboxa do linelabela
4.W pokazanym dialogu wybierz sobie,jaki sygnał checkboxa życzysz sobie podpiąć do jakiego slotu labela.UWAGA!Może okazać się potrzebne włączenie opcji "Show all signals/slots" u dołu

ot i tyle

0

Używam Qt Creator-a

0
piotrekg1987 napisał(a)

Używam Qt Creator-a

to zacznij jeszcze używać dokumentacji. łap poza tym w QtCreatorze również masz ją dostępną.

0

Pojawiający się błąd jednak nie wynika bezpośrednio z błędnej definicji połączenia sygnał-slot. Błędy które podałem wyżej pojawiają się kiedy zmienię wartość enabled j którejkolwiek z kontrolek. Kompilator wskazuje na plik ui_mainwindow.h a dokłądnie na wpis : nr_1->setEnabled(true);. Przed zmianą tego parametru wpisu nie ma i błąd sie nie pojawia. Jednak muszę wyłaczyć tą kontrolke domyslnie.

0

w QtCreatorze wystarczy że zrobisz tak:

user image

nie trzeba nic pisać w kodzie.

PS. to zakładając, że używasz wizualnego edytora formularzy. jeśli piszesz cały kod ręcznie, to nie ma znaczenia jakiego środowiska używasz.

0

Z tym że okazuje się że błędy dotyczą czegoś innego a mianowicie tak jak pisałem wyżej, zmiana wartości enable elementu lineEdit z true na false, powoduje wpis w ui_mainwindow.h który ma postać, nr_1->setEnabled(false);
Podczas kompilacji wyskakuje błąd który wskazuję na to miejsce (dokładnie dwa błędy ponieważ mam dwa takie widgety w projekcie):

Uruchamianie "C:\QtSDK\mingw\bin\mingw32-make.exe"
C:/QtSDK/mingw/bin/mingw32-make -f Makefile.Debug
mingw32-make[1]: Entering directory C:/ocs_2' g++ -mthreads -Wl,-subsystem,windows -o debug\ocs_centrala.exe debug/main.o debug/mainwindow.o debug/moc_mainwindow.o -L"c:\QtSDK\Desktop\Qt\4.7.4\mingw\lib" -lmingw32 -lqtmaind -lQtGuid4 -lQtCored4 -LC:\OpenSSL-Win32_full\lib mingw32-make[1]: Leaving directory C:/ocs_2'
debug/mainwindow.o\ocs_2/ui_mainwindow.h undefined reference to _imp___ZN9QLineEdit10setEnabledEb' debug/mainwindow.o:C:\ocs_2/ui_mainwindow.h:97: undefined reference to _imp___ZN9QLineEdit10setEnabledEb'
collect2: ld returned 1 exit status
mingw32-make[1]: *** [debug\ocs_centrala.exe] Error 1
mingw32-make: *** [debug] Error 2
Proces "C:\QtSDK\mingw\bin\mingw32-make.exe" zakończył się kodem wyjściowym 2.
Błąd podczas budowania projektu ocs_centrala (produkt docelowy: Desktop)
Podczas wykonywania kroku budowania "Make"

0

Pokaż kod+plik .ui od okna-wróżbitami nie jesteśmy.
Btw,w konstruktorze masz wywołanie yourUICLass.setupUi(this)?

0

#include <QSettings>
#include "mainwindow.h"
#include "ui_mainwindow.h"

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

/*ui->combo_nr->addItem("/");
ui->combo_nr->addItem("-");*/
pobierzUstawienia();

}//MainWindow::MainWindow(QWidget *parent)

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


ui_mainwindow.h

void setupUi(QMainWindow *MainWindow)
{
if (MainWindow->objectName().isEmpty())
MainWindow->setObjectName(QString::fromUtf8("MainWindow"));
MainWindow->resize(402, 370);
MainWindow->setMaximumSize(QSize(600, 600));
centralWidget = new QWidget(MainWindow);
centralWidget->setObjectName(QString::fromUtf8("centralWidget"));
gridLayout_6 = new QGridLayout(centralWidget);
gridLayout_6->setSpacing(6);
gridLayout_6->setContentsMargins(11, 11, 11, 11);
gridLayout_6->setObjectName(QString::fromUtf8("gridLayout_6"));
groupBox_2 = new QGroupBox(centralWidget);
groupBox_2->setObjectName(QString::fromUtf8("groupBox_2"));
gridLayout = new QGridLayout(groupBox_2);
gridLayout->setSpacing(6);
gridLayout->setContentsMargins(11, 11, 11, 11);
gridLayout->setObjectName(QString::fromUtf8("gridLayout"));
horizontalLayout = new QHBoxLayout();
horizontalLayout->setSpacing(6);
horizontalLayout->setObjectName(QString::fromUtf8("horizontalLayout"));
nr_1 = new QLineEdit(groupBox_2);
nr_1->setObjectName(QString::fromUtf8("nr_1"));
nr_1->setEnabled(true);
nr_1->setMaximumSize(QSize(90, 16777215));
nr_1->setMaxLength(9);

    horizontalLayout->addWidget(nr_1);

    label = new QLabel(groupBox_2);
    label->setObjectName(QString::fromUtf8("label"));

    horizontalLayout->addWidget(label);

    nr_2 = new QLineEdit(groupBox_2);
    nr_2->setObjectName(QString::fromUtf8("nr_2"));
    nr_2->setEnabled(false);
    nr_2->setMaximumSize(QSize(45, 16777215));
    nr_2->setMaxLength(5);

    horizontalLayout->addWidget(nr_2);

    komplet = new QCheckBox(groupBox_2);
    komplet->setObjectName(QString::fromUtf8("komplet"));

    horizontalLayout->addWidget(komplet);

    horizontalSpacer = new QSpacerItem(40, 20, QSizePolicy::Expanding, QSizePolicy::Minimum);

    horizontalLayout->addItem(horizontalSpacer);


    gridLayout->addLayout(horizontalLayout, 0, 0, 1, 1);


    gridLayout_6->addWidget(groupBox_2, 0, 0, 1, 1);

    groupBox = new QGroupBox(centralWidget);
    groupBox->setObjectName(QString::fromUtf8("groupBox"));
    gridLayout_3 = new QGridLayout(groupBox);
    gridLayout_3->setSpacing(6);
    gridLayout_3->setContentsMargins(11, 11, 11, 11);
    gridLayout_3->setObjectName(QString::fromUtf8("gridLayout_3"));
    gridLayout_2 = new QGridLayout();
    gridLayout_2->setSpacing(6);
    gridLayout_2->setObjectName(QString::fromUtf8("gridLayout_2"));
    label_3 = new QLabel(groupBox);
    label_3->setObjectName(QString::fromUtf8("label_3"));

    gridLayout_2->addWidget(label_3, 0, 0, 1, 1);

    imie = new QLineEdit(groupBox);
    imie->setObjectName(QString::fromUtf8("imie"));

    gridLayout_2->addWidget(imie, 0, 1, 1, 1);

    label_4 = new QLabel(groupBox);
    label_4->setObjectName(QString::fromUtf8("label_4"));

    gridLayout_2->addWidget(label_4, 0, 2, 1, 1);

    nazwisko = new QLineEdit(groupBox);
    nazwisko->setObjectName(QString::fromUtf8("nazwisko"));

    gridLayout_2->addWidget(nazwisko, 0, 3, 1, 1);


    gridLayout_3->addLayout(gridLayout_2, 0, 0, 1, 1);


    gridLayout_6->addWidget(groupBox, 1, 0, 1, 1);

    groupBox_3 = new QGroupBox(centralWidget);
    groupBox_3->setObjectName(QString::fromUtf8("groupBox_3"));
    gridLayout_4 = new QGridLayout(groupBox_3);
    gridLayout_4->setSpacing(6);
    gridLayout_4->setContentsMargins(11, 11, 11, 11);
    gridLayout_4->setObjectName(QString::fromUtf8("gridLayout_4"));

    gridLayout_6->addWidget(groupBox_3, 2, 0, 1, 1);

    groupBox_4 = new QGroupBox(centralWidget);
    groupBox_4->setObjectName(QString::fromUtf8("groupBox_4"));
    gridLayout_5 = new QGridLayout(groupBox_4);
    gridLayout_5->setSpacing(6);
    gridLayout_5->setContentsMargins(11, 11, 11, 11);
    gridLayout_5->setObjectName(QString::fromUtf8("gridLayout_5"));
    horizontalLayout_2 = new QHBoxLayout();
    horizontalLayout_2->setSpacing(6);
    horizontalLayout_2->setObjectName(QString::fromUtf8("horizontalLayout_2"));
    label_5 = new QLabel(groupBox_4);
    label_5->setObjectName(QString::fromUtf8("label_5"));

    horizontalLayout_2->addWidget(label_5);

    pokoj = new QLineEdit(groupBox_4);
    pokoj->setObjectName(QString::fromUtf8("pokoj"));
    pokoj->setMaximumSize(QSize(100, 16777215));

    horizontalLayout_2->addWidget(pokoj);

    horizontalSpacer_2 = new QSpacerItem(40, 20, QSizePolicy::Expanding, QSizePolicy::Minimum);

    horizontalLayout_2->addItem(horizontalSpacer_2);


    gridLayout_5->addLayout(horizontalLayout_2, 0, 0, 1, 1);


    gridLayout_6->addWidget(groupBox_4, 3, 0, 1, 1);

    zatwierdz = new QPushButton(centralWidget);
    zatwierdz->setObjectName(QString::fromUtf8("zatwierdz"));

    gridLayout_6->addWidget(zatwierdz, 4, 0, 1, 1);

    MainWindow->setCentralWidget(centralWidget);
    QWidget::setTabOrder(nr_1, nr_2);
    QWidget::setTabOrder(nr_2, zatwierdz);

    retranslateUi(MainWindow);
    QObject::connect(zatwierdz, SIGNAL(clicked()), MainWindow, SLOT(action_zatwierdz()));

    QMetaObject::connectSlotsByName(MainWindow);
} // setupUi
0

Kompletnie wyczyść projekt,wręcz stwórz nowy,pusty projekt Qt Application i dodaj swoje źródła(jeśli Clean Solution/Rebuild Solution nie pomoże).
Qt Creatorowi czasem odbija i ma problemy z linkowaniem.

0

Niestety to nie pomaga ;(

0

To zapodawaj cały projekt do .zip-a

0

Generalnie po utworzeniu pustego projektu i dodaniu jednego widgetu Line Edit i zmianie jego opcji enabled na false, przez zwykłe odznaczenie checkboxa w Designerze, powoduje błąd podczas kompilacji. Proszę spróbować:)

0

Szukając, eliminując możliwe konflikty, doszedłem do etapu gdzie utworzyłem zupełnie nowy projekt w Qt Creatorze, dodałem jednego widgeta Line Edit w Designerze, wyłączyłem go odznaczając opcję enabled, i uruchomiłem projekt. Błąd identyczny jak w moim projekcie. Zaznaczam, że nie kopiowałem do tej próby żadnego kodu z mojego projektu.

Qt Creator 2.3.0
Based on Qt 4.7.4 (32 bit)
Built on Aug 25 2011 at 1528

0

A kompilują Ci się jakiekolwiek projekty, wbudowane już w QtCreatora? Jeśli też masz jakieś błędy, to jedyne rozwiązanie to reinstalacja (wiem, że męcząca ...) poczyść wszystko i zainstaluj jeszcze raz, mi to kiedyś pomogło ...

0

Inne projekty kompilują się, ten projekt nad którym pracowałem też działał do czasu aż nie zmieniłem tej wartości enable tego widgeta, polecam spróbować u siebie.

0

Jak zauważyłem problem dotyczy tylko kontrolki Line Edit. Żadna inna kontrolka nie powoduję błędu przy kompilacji kiedy zmienie jej wartość enabled na false. Stąd moje zdziwienie i zaskoczenie.

0
MasterBLB napisał(a)

Kompletnie wyczyść projekt,wręcz stwórz nowy,pusty projekt Qt Application i dodaj swoje źródła(jeśli Clean Solution/Rebuild Solution nie pomoże).
Qt Creatorowi czasem odbija i ma problemy z linkowaniem.

A moze wystarczyloby usunac plik .user?

1 użytkowników online, w tym zalogowanych: 0, gości: 1