Accessing widgets from my class
-
wrote on 24 Apr 2012, 01:22 last edited by
Sorry I'm probably being really dumb right now.
Anyway, I read it, but I am not understanding how this will help me. The header file that contains the code you said previously is called clock_application.h
-
wrote on 24 Apr 2012, 01:28 last edited by
Well, did you manage to locate the header file generated by UIC?
If so, did you inspect that file to make sure it contains a definition of Ui::Clock_Application ???
In your code you use the Ui::Clock_Application class (note hat that is one is different from the Clock_Application class without the "Ui::"). This requires that this class is defined somewhere. Your error message indicates that you have a forward-declaration of that class, but no definition of it! A forward-declaration is sufficient to declare the pointer member variable in your own class, but as soon as you want to dereference the pointer, a full definition is required. That definition usually is given in the header file generated by UIC (from your .UI file).
-
wrote on 24 Apr 2012, 01:34 last edited by
Aha, I found it! I just recalled there are two folders for a project! Let me copy and paste the code for you. It's a long piece.
@
/********************************************************************************
** Form generated from reading UI file 'clock_application.ui'
**
** Created: Sat Mar 17 18:50:58 2012
** by: Qt User Interface Compiler version 4.7.4
**
** WARNING! All changes made in this file will be lost when recompiling UI file!
********************************************************************************/#ifndef UI_CLOCK_APPLICATION_H
#define UI_CLOCK_APPLICATION_H#include <QtCore/QVariant>
#include <QtGui/QAction>
#include <QtGui/QApplication>
#include <QtGui/QButtonGroup>
#include <QtGui/QHeaderView>
#include <QtGui/QLineEdit>
#include <QtGui/QMainWindow>
#include <QtGui/QPushButton>
#include <QtGui/QStatusBar>
#include <QtGui/QTabWidget>
#include <QtGui/QToolBar>
#include <QtGui/QWidget>QT_BEGIN_NAMESPACE
class Ui_Clock_Application
{
public:
QWidget *centralWidget;
QTabWidget *ClockSet;
QWidget *Stopwatch;
QLineEdit *Output;
QPushButton *Start;
QPushButton *Pause;
QPushButton *Reset;
QWidget *Alarm;
QToolBar *mainToolBar;
QStatusBar *statusBar;void setupUi(QMainWindow *Clock_Application) { if (Clock_Application->objectName().isEmpty()) Clock_Application->setObjectName(QString::fromUtf8("Clock_Application")); Clock_Application->resize(400, 300); centralWidget = new QWidget(Clock_Application); centralWidget->setObjectName(QString::fromUtf8("centralWidget")); ClockSet = new QTabWidget(centralWidget); ClockSet->setObjectName(QString::fromUtf8("ClockSet")); ClockSet->setGeometry(QRect(10, 0, 371, 241)); ClockSet->setTabPosition(QTabWidget::North); ClockSet->setTabShape(QTabWidget::Rounded); Stopwatch = new QWidget(); Stopwatch->setObjectName(QString::fromUtf8("Stopwatch")); Output = new QLineEdit(Stopwatch); Output->setObjectName(QString::fromUtf8("Output")); Output->setGeometry(QRect(120, 50, 131, 31)); Output->setAlignment(Qt::AlignCenter); Start = new QPushButton(Stopwatch); Start->setObjectName(QString::fromUtf8("Start")); Start->setGeometry(QRect(40, 110, 81, 31)); Pause = new QPushButton(Stopwatch); Pause->setObjectName(QString::fromUtf8("Pause")); Pause->setGeometry(QRect(150, 110, 81, 31)); Reset = new QPushButton(Stopwatch); Reset->setObjectName(QString::fromUtf8("Reset")); Reset->setGeometry(QRect(250, 110, 81, 31)); ClockSet->addTab(Stopwatch, QString()); Alarm = new QWidget(); Alarm->setObjectName(QString::fromUtf8("Alarm")); ClockSet->addTab(Alarm, QString()); Clock_Application->setCentralWidget(centralWidget); mainToolBar = new QToolBar(Clock_Application); mainToolBar->setObjectName(QString::fromUtf8("mainToolBar")); Clock_Application->addToolBar(Qt::TopToolBarArea, mainToolBar); statusBar = new QStatusBar(Clock_Application); statusBar->setObjectName(QString::fromUtf8("statusBar")); Clock_Application->setStatusBar(statusBar); retranslateUi(Clock_Application); QObject::connect(Start, SIGNAL(clicked()), Clock_Application, SLOT(timer_Start())); ClockSet->setCurrentIndex(0); QMetaObject::connectSlotsByName(Clock_Application); } // setupUi void retranslateUi(QMainWindow *Clock_Application) { Clock_Application->setWindowTitle(QApplication::translate("Clock_Application", "Clock_Application", 0, QApplication::UnicodeUTF8)); Output->setText(QApplication::translate("Clock_Application", "00:00:00", 0, QApplication::UnicodeUTF8)); Start->setText(QApplication::translate("Clock_Application", "Start", 0, QApplication::UnicodeUTF8)); Pause->setText(QApplication::translate("Clock_Application", "Pause", 0, QApplication::UnicodeUTF8)); Reset->setText(QApplication::translate("Clock_Application", "Reset", 0, QApplication::UnicodeUTF8)); ClockSet->setTabText(ClockSet->indexOf(Stopwatch), QApplication::translate("Clock_Application", "Stopwatch", 0, QApplication::UnicodeUTF8)); ClockSet->setTabText(ClockSet->indexOf(Alarm), QApplication::translate("Clock_Application", "Alarm", 0, QApplication::UnicodeUTF8)); } // retranslateUi
};
namespace Ui {
class Clock_Application: public Ui_Clock_Application {};
} // namespace UiQT_END_NAMESPACE
#endif // UI_CLOCK_APPLICATION_H
@ -
wrote on 24 Apr 2012, 01:39 last edited by
So Ui::Clock_Application is defined (lines 103 to 105).
But then I don't understand why the compiler throws the following error:
@invalid use of incomplete struct type ‘struct Ui::Clock_Application’ @Are you 100% sure the source code file that throws this error includes the exactly same header file you quoted?
-
wrote on 24 Apr 2012, 01:45 last edited by
I've had a problem like that before with mutual friendship classes. I fixed it by simply defining the functions after both classes were defined. Obviously, this is not the problem in this case..
-
wrote on 24 Apr 2012, 01:48 last edited by
Time to post your complete clock_application.h and clock_application.cpp, I think.
-
wrote on 24 Apr 2012, 02:15 last edited by
clock_application.h:
@
#ifndef CLOCK_APPLICATION_H
#define CLOCK_APPLICATION_H#include <QMainWindow>
#include <QTimer>
#include <QLineEdit>namespace Ui {
class Clock_Application;
}class Clock_Application : public QMainWindow
{
Q_OBJECTpublic:
explicit Clock_Application(QWidget *parent = 0);
~Clock_Application();
public slots:
void timer_Start();
void changeTime();
private:
Ui::Clock_Application ui;
QTimer timer;
};void Clock_Application::timer_Start()
{
timer = new QTimer();
connect(timer, SIGNAL(timeout()), this, SLOT(changeTime()));
timer->start(1000);
}void Clock_Application::changeTime()
{
std::vector<int> times;
QRegExp findTimeSequences("(\d+)");
QString currentTime(ui->Output->text());int posOffset(0); while ((posOffset = findTimeSequences.indexIn(currentTime, posOffset)) != -1) { times.push_back(findTimeSequences.cap(1).toInt()); posOffset += findTimeSequences.matchedLength(); } times[2] += 1; QString outputTime; for (int i = (int) times.size() - 1; i >= 0; i--) { if (times[i] == 60 && i > 0) { times[i-1] += 1; times[i] = 0; } QString currentNum; currentNum.setNum(times[i]); if (times[i] <= 9 && i >= 0) { currentNum.insert(0, QString("0")); } if (i < 2) { currentNum.append(":"); } outputTime.insert(0, currentNum); } ui->Output->setText(outputTime);
}
#endif // CLOCK_APPLICATION_H
@clock_application.cpp:
@
#include "clock_application.h"
#include "ui_clock_application.h"
#include "QString"
#include "QRegExp"
#include "vector"
#include "QThread"Clock_Application::Clock_Application(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::Clock_Application)
{
ui->setupUi(this);
}Clock_Application::~Clock_Application()
{
delete ui;
}
@ -
wrote on 24 Apr 2012, 11:42 last edited by
In your header file you are trying to dereference ui, although you only have a forward-declartion of Ui::Clock_Application there! This can't work, obviously. The definition of the Ui::Clock_Application class in "ui_clock_application.h" is included in your .cpp file only! Simply move Clock_Application::changeTime() and Clock_Application::timer_Start() into the .cpp file. These don't belong into the header file anyway...
Solution:
clock_application.h:
@#ifndef CLOCK_APPLICATION_H
#define CLOCK_APPLICATION_H#include <QMainWindow>
#include <QTimer>
#include <QLineEdit>namespace Ui {
class Clock_Application; //Only forward-declartion here !!!
}class Clock_Application : public QMainWindow
{
Q_OBJECTpublic:
explicit Clock_Application(QWidget *parent = 0);
~Clock_Application();
public slots:
void timer_Start();
void changeTime();
private:
Ui::Clock_Application ui; //forward-declartion sufficient here
QTimer timer;
};#endif // CLOCK_APPLICATION_H@
clock_application.cpp:
@#include "clock_application.h"
#include "ui_clock_application.h" //Contains the full class definition
#include "QString"
#include "QRegExp"
#include "vector"
#include "QThread"Clock_Application::Clock_Application(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::Clock_Application)
{
ui->setupUi(this);
}Clock_Application::~Clock_Application()
{
delete ui;
}void Clock_Application::timer_Start()
{
timer = new QTimer();
connect(timer, SIGNAL(timeout()), this, SLOT(changeTime()));
timer->start(1000);
}void Clock_Application::changeTime()
{
std::vector<int> times;
QRegExp findTimeSequences("(\d+)");
QString currentTime(ui->Output->text()); //Requires full class definition !!!int posOffset(0); while ((posOffset = findTimeSequences.indexIn(currentTime, posOffset)) != -1) { times.push_back(findTimeSequences.cap(1).toInt()); posOffset += findTimeSequences.matchedLength(); } times[2] += 1; QString outputTime; for (int i = (int) times.size() - 1; i >= 0; i--) { if (times[i] == 60 && i > 0) { times[i-1] += 1; times[i] = 0; } QString currentNum; currentNum.setNum(times[i]); if (times[i] <= 9 && i >= 0) { currentNum.insert(0, QString("0")); } if (i < 2) { currentNum.append(":"); } outputTime.insert(0, currentNum); } ui->Output->setText(outputTime); //Requires full class definition !!!
}@
-
wrote on 24 Apr 2012, 20:43 last edited by
Works like a charm. Thanks for all the help!
21/29