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.
podłącz checkBox.toggled(bool) do lineEdit.setEnabled(bool)
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'
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
Używam Qt Creator-a
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ą.
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.
w QtCreatorze wystarczy że zrobisz tak:
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.
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"
Pokaż kod+plik .ui od okna-wróżbitami nie jesteśmy.
Btw,w konstruktorze masz wywołanie yourUICLass.setupUi(this)?
#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
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.
Niestety to nie pomaga ;(
To zapodawaj cały projekt do .zip-a
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ć:)
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
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 ...
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.
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.
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?