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&)[withT=アポイントメント]'........\ QtSDK \ Desktop \ Qt \ 4.8.1 \mingw\からインスタンス化include / QtCore / qlist.h:512:
'void QList :: append(const T&)[with T=pointment]'からインスタンス化..\projectOOI / appointoverview.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オブジェクトモデルページのIDと値に関する説明にあります。

主な結果は、QObject(またはQObjectサブクラス)へのポインターを使用する必要があることです。そうしないと、QObjectサブクラスを値として使用したくなる可能性があります。たとえば、コピーコンストラクターがないと、QObjectのサブクラスをコンテナークラスの1つに格納される値として使用することはできません。ポインタを保存する必要があります。

于 2012-08-16T21:45:06.310 に答える