How to Develop a Calendar Widget.
-
Hello Andre,thank you for making understand me the rules of the forum.
So here is my code so far.
@#include "dialog.h"
#include "ui_dialog.h"
#include<QCalendarWidget>
#include<QDate>
#include "dialog1.h"
#include "ui_dialog1.h"
#include<QPainter>Dialog::Dialog(QWidget *parent) :
QDialog(parent),
ui(new Ui::Dialog)
{
ui->setupUi(this);}
Dialog::~Dialog()
{
delete ui;
}void Dialog::on set_clicked()
{colddate.setBackground(Qt::yellow);//colddate has been declared in .h file it is a object of QTextCharFormat
hotdate.setBackground(Qt::red);
wetdate.setBackground(Qt::green);
raindate.setBackground(Qt::blue);
ui->calendarWidget->setDateTextFormat(QDate(2011,4,1),colddate);
ui->calendarWidget->setDateTextFormat(QDate(2011,4,5),hotdate);
ui->calendarWidget->setDateTextFormat(QDate(2011,4,8),wetdate);
ui->calendarWidget->setDateTextFormat(QDate(2011,4,9),raindate);
ui->calendarWidget->setDateTextFormat(QDate(2011,4,12),colddate);
ui->calendarWidget->setDateTextFormat(QDate(2011,4,14),hotdate);
}void Dialog::on unset_clicked()
{colddate.clearBackground();//function to clear the background
hotdate.clearBackground();
wetdate.clearBackground();
raindate.clearBackground();ui->calendarWidget->setDateTextFormat(QDate(2011,4,1),colddate);
ui->calendarWidget->setDateTextFormat(QDate(2011,4,5),hotdate);
ui->calendarWidget->setDateTextFormat(QDate(2011,4,8),wetdate);
ui->calendarWidget->setDateTextFormat(QDate(2011,4,9),raindate);
ui->calendarWidget->setDateTextFormat(QDate(2011,4,12),colddate);
ui->calendarWidget->setDateTextFormat(QDate(2011,4,14),hotdate);
}
@
Here I have used the designer for qcalendarwidget and two pushbuttons which i have named set and unset respectively,and wriiten the code for click as shown above.Now these 3 widgets are on one form,and they work perfectly.
But if the push buttons are on different form,and Qcalendar widget on another form,then when i click on these,how can set colors of qcalendarwidget which is in the another form.and also I tried to add backgroundimage to cell using
colddate.BackgroundImageUrl.... -
Declare your own two signals (setClicked() and unsetClicked()) in the second form, emit these signals once the respective button is clicked. In your first dialog create two slots (eg. setWeatherColors() and unsetWeatherColors()). These slots contain the code from on_set_clicked and on_unset_clicked. Connect the two signals from the second dialog to the slots in the first (do this in the very same place where you instantiate the second dialog).
If you do not know how to declare signals and slots: Start reading "here":http://doc.qt.nokia.com/4.7/signalsandslots.html#signals, the page contains a complete example for both.
-
You would use the code for showing a new dialog that I gave you earlier. That is: you create the new dialog, set the data on it that you need to do proper editing, exec() it, and read back the new value through a public method on your dialog that you have created for that purpose.
What I don't understand in the sample that you are currently showing, is why you are re-setting the actual formats, instead of changing or removing the set format for the date that you are editing. I would keep the hotDate and coldDate formats themselves constant, and just change which one you set on which date. That would make more sense, I think.
-
Hello Volker,here is my code according to your suggestion.
dialog1.h//declaring signals@#ifndef DIALOG1_H
#define DIALOG1_H#include <QDialog>
#include<QDate>
#include<QTextFormat>
namespace Ui {
class Dialog1;
}class Dialog1 : public QDialog
{
Q_OBJECTpublic:
explicit Dialog1(QWidget *parent = 0);
~Dialog1();private:
Ui::Dialog1 *ui;private slots:
// void on_radioButton_clicked();
signals:
void setclicked();
void unsetclicked();private slots:
void on_pushButton_2_clicked();
void on_pushButton_clicked();
};#endif // DIALOG1_H
@dialog1.cpp//emitting the signals
@
#include "dialog1.h"
#include "ui_dialog1.h"
#include<QCalendarWidget>
Dialog1::Dialog1(QWidget *parent) :
QDialog(parent),
ui(new Ui::Dialog1)
{
ui->setupUi(this);
connect(ui->pushButton,SIGNAL(setclicked()),this,SLOT(setcolors()));
connect(ui->pushButton_2,SIGNAL(unsetclicked()),this,SLOT(unsetcolors()));
}Dialog1::~Dialog1()
{
delete ui;
}void Dialog1::on_pushButton_clicked()
{
emit setclicked();
}void Dialog1::on_pushButton_2_clicked()
{
emit unsetclicked();
}
@whether I am correct.?
thanks
imrrk -
You are now emitting signals from Dialog1 (you might want to think of a more descriptive name to improve code readability), but you are not handing these signals in slots. To fix that, you are going to need to define two slots in Dialog, and connect the signals to these slots.
-
Is the problem that you don't see the dialog pop up, or that the dates are not cleared when you click one of the buttons on the dialog?
Did you:
- actually connect the signals with the slots?
- check your output while running to see if the connection worked?
- put debug statements or breakpoints at the relevant places to track what breaks down exactly?
-
[quote author="Andre" date="1302698169"]Did you:
- actually connect the signals with the slots?
- check your output while running to see if the connection worked?
- put debug statements or breakpoints at the relevant places to track what breaks down exactly?
[/quote]
-
The sender of the signal is typically the object, that sends them, the receivedr is the object that implements the slots.
so If you are inside the code of dlg1, which implements the slots and invoke there a dialog dlgh2 which emiuts the signals you do:
@
dlg1::foo()
{
dlg2 dlg;
connect(&dlg, SIGNAL(fooSignal()), this, SLOT(fooSlot()));
dlg.exec();
}
@ -
hey gerolf in dialog1.cpp ,i have emmitted two signals on click of push buttons and connected them as shown below..I dont know whether i am correct in this,now I have my maindialog1.cpp where i wriiten the slots for setting colors,now I am not getting how shall i make connections with the signals i emmitted in dialog1.cpp and the slots in my maindialog.cpp,which contains the slots..
@#include "dialog1.h"
#include "ui_dialog1.h"
#include<QCalendarWidget>
Dialog1::Dialog1(QWidget *parent) :
QDialog(parent),
ui(new Ui::Dialog1)
{
ui->setupUi(this);
connect(ui->set,SIGNAL(clicked()),this,SIGNAL(setclicked()));
connect(ui->unset,SIGNAL(clicked()),this,SIGNAL(unsetclicked()));
}Dialog1::~Dialog1()
{
delete ui;
}void Dialog1::on_set_clicked()
{
emit setclicked();
}void Dialog1::on_unset_clicked()
{
emit unsetclicked();
}
@
this my dialog.cpp//
@#include "dialog.h"
#include "ui_dialog.h"
#include<QCalendarWidget>
#include<QDate>
#include "dialog1.h"
#include "ui_dialog1.h"
#include<QPainter>
#include <QtGui/QApplication>Dialog::Dialog(QWidget *parent) :
QDialog(parent),
ui(new Ui::Dialog)
{
ui->setupUi(this);
//Dialog1 a(this);
connect(&Dialog1,SIGNAL(setclicked(),this,SLOT(setcolors())));
connect(&Dialog1,SIGNAL(unsetclicked(),this,SLOT(unsetcolors())));// QCalendarWidget *cal=new QCalendarWidget();
// cal->setDateEditEnabled(1);
// cal->setFirstDayOfWeek(Qt::Wednesday);// cal->show();
//ui->calendarWidget->setFirstDayOfWeek(Qt::Thursday);//QTextCharFormat colddate;
//colddate.setBackground(Qt::yellow);//QTextCharFormat hotdate;
//hotdate.setBackground(Qt::red);//QTextCharFormat wetdate;
//wetdate.setBackground(Qt::green);//QTextCharFormat raindate;
//raindate.setBackground(Qt::blue);//ui->calendarWidget->setDateTextFormat(QDate(2011,4,1),colddate);
//ui->calendarWidget->setDateTextFormat(QDate(2011,4,5),hotdate);
//ui->calendarWidget->setDateTextFormat(QDate(2011,4,8),wetdate);
//ui->calendarWidget->setDateTextFormat(QDate(2011,4,9),raindate);
//ui->calendarWidget->setDateTextFormat(QDate(2011,4,12),colddate);
//ui->calendarWidget->setDateTextFormat(QDate(2011,4,14),hotdate);
}Dialog::~Dialog()
{
delete ui;
}void Dialog::on_calendarWidget_clicked(QDate date)
{
// ui->label->setText(date.toString());
//ui->textBrowser->setText(date.toString());
Dialog1 a(this);
a.show();
a.exec();// ui->pushButton->setText(QString::number(date.day()));
}
void Dialog::setcolors()
{safedate.setBackground(Qt::green); //safedate.BackgroundImageUrl
unsafedate.setBackground(Qt::yellow);
fertiledate.setBackground(Qt::red); startdate.setBackground(Qt::blue); ui->calendarWidget->setDateTextFormat(QDate(2011,4,1),startdate); ui->calendarWidget->setDateTextFormat(QDate(2011,4,5),safedate); ui->calendarWidget->setDateTextFormat(QDate(2011,4,8),unsafedate); ui->calendarWidget->setDateTextFormat(QDate(2011,4,9),fertiledate); ui->calendarWidget->setDateTextFormat(QDate(2011,4,12),unsafedate); ui->calendarWidget->setDateTextFormat(QDate(2011,4,14),safedate);
}
void Dialog::unsetcolors()
{
startdate.clearBackground();
safedate.clearBackground();
unsafedate.clearBackground();
fertiledate.clearBackground();
ui->calendarWidget->setDateTextFormat(QDate(2011,4,1),startdate);
ui->calendarWidget->setDateTextFormat(QDate(2011,4,5),safedate);
ui->calendarWidget->setDateTextFormat(QDate(2011,4,8),unsafedate);
ui->calendarWidget->setDateTextFormat(QDate(2011,4,9),fertiledate);
ui->calendarWidget->setDateTextFormat(QDate(2011,4,12),unsafedate);
ui->calendarWidget->setDateTextFormat(QDate(2011,4,14),safedate);
}@regards
imrrk