2

我对 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:在复制构造函数'Timer::Timer(const Timer&)'中:..\projectOOI/timer。 h:9: 实例化自 'void QList::node_construct(QList::Node*, const T&) [with T =ointment]' ........\QtSDK\Desktop\Qt\4.8.1\mingw\ include/QtCore/qlist.h:512:
从 'void QList::append(const T&) [with T =ointment]' 实例化 ..\projectOOI/apppointoverview.h:10: 从这里实例化...... .\QtSDK\Desktop\Qt\4.8.1\mingw\include/QtGui/qwidget.h:806: 错误:'QWidget::QWidget(const QWidget&)' 是私有的 ..\projectOOI/timer.h:9: 错误: 在这种情况下

虽然我已经公开继承了 QWidget ......所以我不明白我哪里出错了

4

1 回答 1

8

这是因为 QObject(以及继承的 QWidget)有一个私有的拷贝构造函数。

一般来说,你应该通过指针/引用而不是值来传递你的对象,以避免使用复制构造函数。或者,您应该能够定义自己的复制构造函数。

来自 Qt 文档

QObject 既没有复制构造函数也没有赋值运算符。这是设计使然。实际上,它们是被声明的,但是在一个带有宏 Q_DISABLE_COPY() 的私有部分中。事实上,所有从 QObject 派生的 Qt 类(直接或间接)都使用这个宏来声明它们的复制构造函数和赋值运算符是私有的。推理可以在 Qt 对象模型页面上关于 Identity vs Value 的讨论中找到。

主要结果是您应该使用指向 QObject(或指向您的 QObject 子类)的指针,否则您可能会试图将 QObject 子类用作值。例如,如果没有复制构造函数,就不能使用 QObject 的子类作为要存储在容器类之一中的值。您必须存储指针。

于 2012-08-16T21:45:06.310 回答