Instantiating gui object issue
-
Hi all
I'm currently trying to write a gui app that has a menu with two options add order and view orders. when add order is clicked the central widget should be a order form and if view orders is selected a QTextEdit with showing all entered orders should be the central widget of the main window. When I try to instantiate a order form object in the add_order_clicked slot I keep getting a error saying 'orderForm was not declared in this scope. I did #include the orderForm class so why won't it let me instantiate it? I tryed re-building/cleaning and running cmake but no luck. Any idea why this would happen?
Thanksmy code:
@
#include <QTGui>
#include "ordergui.h"
#include "orderForm.h"ordergui::ordergui() {
m_text = new QTextEdit;
setCentralWidget(m_text);
createActions();
createMenu();
}void ordergui::createActions() {
add_order = new QAction(("Add Order"), this);
connect(add_order, SIGNAL(triggered()), this, SLOT(add_order_clicked()));view_orders = new QAction(("View Order"), this); connect(view_orders, SIGNAL(triggered()), this, SLOT(view_order_clicked()));}
void ordergui::createMenu() {
orderMenu = menuBar()->addMenu("Order");
orderMenu->addAction(add_order);
orderMenu->addAction(view_orders);
orderMenu->exec();
}void ordergui::add_order_clicked() {
orderForm obj;
setCentralWidget(obj);
}
@ -
Hi,
Is orderForm really the class name ? Casing is important.
On a side note, you're not calling the base class constructor in your constructor
-
Yes i'm sure i'm using the correct name. which base class are you talking about?
this code is copied from another project example. What does it mean when in the constructor QWidget is initialized to parent? What is the parent of QWidget?
Thanks again
Deoncode for orderForm implimentation file:
@
#include "orderform.h"
#include "order.h"
#include <QFormLayout>//constructor
OrderForm::OrderForm(QWidget *parent):QWidget(parent){
setUpGui();
}//sets up the GUI
void OrderForm::setUpGui(){
m_nameEdit = new QLineEdit();
m_dateEdit = new QDateEdit();
m_quantitySpin = new QSpinBox();
m_quantitySpin->setRange(1,1000);
m_priceSpin = new QDoubleSpinBox();
m_priceSpin->setRange(1.0,1000.00);
m_totalEdit = new QLineEdit();
m_totalEdit->setReadOnly(true);
m_submitButton = new QPushButton("OK");
m_cancelButton = new QPushButton("Cancel");QGridLayout* gridLayout = new QGridLayout(); gridLayout->addWidget(m_submitButton,0,0); gridLayout->addWidget(m_cancelButton,0,1); QFormLayout *formLayout = new QFormLayout(); formLayout->addRow(tr("&Name"), m_nameEdit); formLayout->addRow(tr("&Date Added"), m_dateEdit); formLayout->addRow(tr("&Quantity"), m_quantitySpin); formLayout->addRow(tr("&Unit Price"), m_priceSpin); formLayout->addRow(tr("&Total Price"), m_totalEdit); formLayout->addRow(gridLayout); connect(m_submitButton, SIGNAL(clicked()), this, SLOT(submit())); connect(m_cancelButton, SIGNAL(clicked()), this, SLOT(close())); connect(m_quantitySpin, SIGNAL(editingFinished()), this, SLOT(calculateCost())); connect(m_priceSpin, SIGNAL(editingFinished()), this, SLOT(calculateCost())); this->setLayout(formLayout); this->setWindowTitle("Manual Order Form");}
// sets an order
void OrderForm::setOrder(Order prod){
m_Order = prod;
viewOrder();
}//create a new order
void OrderForm::submit(){
m_Order.setName(m_nameEdit->text());
m_Order.setDateAdded(m_dateEdit->date());
m_Order.setQuantity(m_quantitySpin->value());
m_Order.setPrice(m_priceSpin->value());
}//view an order
void OrderForm::viewOrder(){
m_nameEdit->setText(m_Order.name());
m_dateEdit->setDate(m_Order.dateAdded());
m_quantitySpin->setValue(m_Order.quantity());
m_priceSpin->setValue(m_Order.price());
calculateCost();
}
//calculate the cost of an order
void OrderForm::calculateCost(){
double total = double(m_quantitySpin->value()* m_priceSpin->value());
m_totalEdit->setText(QString::number(total, 'f', 2));
}@
-
Your class is not called orderForm but OrderForm, that's why it fails. Casing is important.
Have look "here":http://qt-project.org/doc/qt-5/qwidget.html#QWidget to get an explanation about the parent of QWidget
-
Since both are QWidget:
Clean way:
@
OrderForm::OrderForm(QWidget *parent):
QWidget(parent){}@
Only if you don't expect to parent your widget in the constructor:
@
ordergui::ordergui() {
}@Edit: corrected the wording
-
When I do that I get an error saying QWidget is not a direct base type of ordergui...
Also why was that not done in this example?
http://qt-project.org/doc/qt-4.8/mainwindows-application.html
-
I've updated the wording of my last post (was a bit tired)
Since you have that error, it means that ordergui doesn't inherit from QWidget. It should inherit from QMainWindow.
Since you don't see anything do you call show somewhere in you main.cpp ?
-
Yes I call show from main.cpp but for some reason I don't get any output, any idea what i'm doing wrong?
main.cpp:
@
#include <QtGui>
#include <QApplication>
#include "ordergui.h"int main(int argc, char *argv[]) {
QApplication app(argc, argv);
ordergui order;order.show(); return app.exec();}
@ -
[quote author="Dn588" date="1397930234"]Hi Xander. Sorry yes I changed it to OrderForm* obj but for some reason there's no output. Also when I try to close the running program I have to force quit[/quote]
Then you have most like created another (invisible) top level windows, if you have to "kill" the app.
you can try setting the parent of your central widget, I though the setCentralWidget would reparent it, but maybe not:
@
setCentralWidget(new orderForm(this));
@
maybe that works. -
My Code:
@
order.h#ifndef ORDER_H
#define ORDER_H#include <QString>
#include <QDate>class Order {
public:
//getters
QString name() const {return m_name;}
QDate dateAdded() const { return m_added; }
int quantity() const {return m_quantity; }
double price() const {return m_price;}//return a string representation of an order QString toString() const; //setters void setName(const QString &name) {m_name = name;} void setDateAdded(const QDate &added) {m_added = added;} void setQuantity(int qty) {m_quantity = qty;} void setPrice(double unitPrice) {m_price = unitPrice;}private:
//data members
QString m_name;
QDate m_added;
int m_quantity;
double m_price;};
#endif // #ifndef ORDER_H
order.cpp
#include "order.h"
#include <QString>//returns the string representation of an order
QString Order::toString() const {
return QString("%1 %2 (%3)at $ %4 total: %5").arg(m_name)
.arg(m_added.toString("yyyyMMdd")).arg(m_quantity)
.arg(m_price).arg(m_quantity*m_price);
}OrderForm.h
#ifndef ORDERFORM_H
#define ORDERFORM_H#include <QtGui>
#include "order.h"class OrderForm : public QWidget {
Q_OBJECTpublic:
//constructor
OrderForm(QWidget* parent);
//view a given order
void setOrder(Order prod);private slots:
//create a new order
void submit();
//calculate the cost of an order
void calculateCost();private:
//private data members
QLineEdit* m_nameEdit;
QDateEdit* m_dateEdit;
QSpinBox* m_quantitySpin;
QDoubleSpinBox* m_priceSpin;
QLineEdit* m_totalEdit;
QPushButton* m_submitButton;
QPushButton* m_cancelButton;Order m_Order; //to view an order void viewOrder(); //sets up the GUI void setUpGui();};
#endif // #ifndef ORDERFORM_H
OrderForm.cpp
#include "orderform.h"
#include "order.h"
#include <QFormLayout>//constructor
OrderForm::OrderForm(QWidget *parent) : QWidget(parent) {
setUpGui();
}//sets up the GUI
void OrderForm::setUpGui(){
m_nameEdit = new QLineEdit();
m_dateEdit = new QDateEdit();
m_quantitySpin = new QSpinBox();
m_quantitySpin->setRange(1,1000);
m_priceSpin = new QDoubleSpinBox();
m_priceSpin->setRange(1.0,1000.00);
m_totalEdit = new QLineEdit();
m_totalEdit->setReadOnly(true);
m_submitButton = new QPushButton("OK");
m_cancelButton = new QPushButton("Cancel");QGridLayout* gridLayout = new QGridLayout(); gridLayout->addWidget(m_submitButton,0,0); gridLayout->addWidget(m_cancelButton,0,1); QFormLayout *formLayout = new QFormLayout(); formLayout->addRow(tr("&Name"), m_nameEdit); formLayout->addRow(tr("&Date Added"), m_dateEdit); formLayout->addRow(tr("&Quantity"), m_quantitySpin); formLayout->addRow(tr("&Unit Price"), m_priceSpin); formLayout->addRow(tr("&Total Price"), m_totalEdit); formLayout->addRow(gridLayout); connect(m_submitButton, SIGNAL(clicked()), this, SLOT(submit())); connect(m_cancelButton, SIGNAL(clicked()), this, SLOT(close())); connect(m_quantitySpin, SIGNAL(editingFinished()), this, SLOT(calculateCost())); connect(m_priceSpin, SIGNAL(editingFinished()), this, SLOT(calculateCost())); this->setLayout(formLayout); this->setWindowTitle("Manual Order Form");}
// sets an order
void OrderForm::setOrder(Order prod){
m_Order = prod;
viewOrder();
}//create a new order
void OrderForm::submit(){
m_Order.setName(m_nameEdit->text());
m_Order.setDateAdded(m_dateEdit->date());
m_Order.setQuantity(m_quantitySpin->value());
m_Order.setPrice(m_priceSpin->value());
}//view an order
void OrderForm::viewOrder(){
m_nameEdit->setText(m_Order.name());
m_dateEdit->setDate(m_Order.dateAdded());
m_quantitySpin->setValue(m_Order.quantity());
m_priceSpin->setValue(m_Order.price());
calculateCost();
}
//calculate the cost of an order
void OrderForm::calculateCost(){
double total = double(m_quantitySpin->value()* m_priceSpin->value());
m_totalEdit->setText(QString::number(total, 'f', 2));
}ordergui.h
#ifndef ORDERGUI_H
#define ORDERGUI_H
#include <QMainWindow>
#include <QTextEdit>class ordergui : public QMainWindow {
Q_OBJECT
public:
ordergui();
public slots:
void add_order_clicked();
void view_orders_clicked();
private:
void createMenu();
void createActions();
QTextEdit* m_text;
QMenu* orderMenu;
QAction* add_order;
QAction* view_orders;
};#endif // ORDERGUI_H
ordergui.cpp
#include <QTGui>
#include "ordergui.h"
#include "OrderForm.h"ordergui::ordergui() {
m_text = new QTextEdit;
setCentralWidget(m_text);
createActions();
createMenu();
}void ordergui::createActions() {
add_order = new QAction(("Add Order"), this);
connect(add_order, SIGNAL(triggered()), this, SLOT(add_order_clicked()));view_orders = new QAction(("View Order"), this); connect(view_orders, SIGNAL(triggered()), this, SLOT(view_orders_clicked()));}
void ordergui::createMenu() {
orderMenu = menuBar()->addMenu("Order");
orderMenu->addAction(add_order);
orderMenu->addAction(view_orders);
orderMenu->exec();
}void ordergui::add_order_clicked() {
//OrderForm* obj = new OrderForm;
setCentralWidget(new OrderForm(this));
}void ordergui::view_orders_clicked() {
setCentralWidget(m_text);
}main.cpp
#include <QtGui>
#include <QApplication>
#include "ordergui.h"int main(int argc, char *argv[]) {
QApplication app(argc, argv);
ordergui order1;order1.show(); return app.exec();}
@
[edit: modified the code to allow proper tagging SGaist]
-
HI, sorry I tried to copy your messed up code here but it's almost impossible because it puts everything into one line and the quotations are also messed up etc.
If you put it in proper code tags or just zip and upload your project somewhere I will try finding your error, but not like this if I have to cleanup all the code just to recreate your whole project. :D
-
Hi Xander thanks for taking a look
I uploaded it to dropbox, hope that's ok?download link:
https://www.dropbox.com/s/i2hz6per5o78lry/Order-exercise.rar