我对c ++中的qt有疑问
头文件:
#ifndef TIMER_H
#define TIMER_H
#include <QWidget>
#include <QTimer>
#include <QtGui>
#include <QObject>
class Timer : public QWidget
{
Q_OBJECT
public:
Timer(QWidget * parent = 0);
void setTimer(QString title, QString description, QDate date);
public slots:
void showWarning() {QString show = tit;
QPushButton * thanks = new QPushButton(QObject::tr("Thank you for reminding me!"));
show.append("\n");
show.append(des);
QMessageBox popup;
popup.setText(show);
popup.setWindowTitle("Calendar : Reminder");
popup.setDefaultButton(thanks);
popup.exec();
}
private:
QString tit;
QString des;
};
#endif // TIMER_H
cpp文件:
#include "timer.h"
Timer::Timer(QWidget * parent)
: QWidget(parent)
{
}
void Timer::setTimer(QString title, QString description, QDate date)
{
QDateTime now = QDateTime::currentDateTime();
QDateTime timeoftheaction;
QTimer *timer=new QTimer;
tit = title;
des = description;
timeoftheaction.setDate(date);
timeoftheaction.setTime(reminderTime);
QObject::connect(timer, SIGNAL(timeout()),this,SLOT(showWarning()));
timer->start(now.secsTo(timeoftheaction)*1000);
}
当我编译时,我得到错误:
........ \ QtSDK \ Desktop \ Qt \ 4.8.1 \ mingw \ include / QtGui / qwidget.h:In 复制构造函数'Timer :: Timer(const Timer&amp;)': .. \ projectOOI / timer.h:9:从'void实例化 QList :: node_construct(QList :: Node *,const T&amp;)[with T = 约定]' ........ \ QTSDK \桌面\ Qt的\ 4.8.1 \ mingw的\包括/ QtCore / qlist.h:512:
从'void QList :: append(const T&amp;)实例化[与T = 预约]'.. \ projectOOI / appointoverview.h:10:实例化 这里 ........ \ QTSDK \桌面\ Qt的\ 4.8.1 \ mingw的\包括/ QtGui / qwidget.h:806: 错误:'QWidget :: QWidget(const QWidget&amp;)'是私有的 .. \ projectOOI / timer.h:9:错误:在此上下文中
虽然我继承了QWidget publicaly ...所以我不知道我哪里出错了
答案 0 :(得分:7)
这是因为QObject(以及继承的QWidget)具有私有拷贝构造函数。
一般来说,你应该通过指针/引用而不是值来传递你的对象,以避免使用复制构造函数。或者,您应该能够定义自己的复制构造函数。
来自Qt文档
QObject既没有复制构造函数也没有赋值运算符。 这是设计的。实际上,他们被宣布,但在私人 带有宏Q_DISABLE_COPY()的部分。实际上,所有的Qt类 派生自QObject(直接或间接)使用此宏来声明 他们的复制构造函数和赋值运算符是私有的。该 关于Qt上的身份与价值的讨论中可以找到推理 对象模型页面。
主要后果是你应该使用 您可能在哪里指向QObject(或您的QObject子类) 否则很想使用您的QObject子类作为值。对于 例如,没有复制构造函数,就不能使用子类 QObject作为要存储在其中一个容器类中的值。您 必须存储指针。