从不同的类访问/修改QDialog的成员?

时间:2016-02-20 08:43:53

标签: c++ qt

我有一个需要访问QDialog成员的类,但我不能这样做,以便该类可以看到它需要什么。只是为了给出一些背景知识:最终目标是让QTextEdit小部件淡出并在显示5秒后隐藏。这是我的代码(只有相关的部分;我要求更多关于范围问题的内容):

dialog.h

#ifndef DIALOG_H
#define DIALOG_H

#include <QDialog>
#include "mytimer.h"

namespace Ui {
class Dialog;
}

class Dialog : public QDialog
{
  Q_OBJECT

public:
  explicit Dialog(QWidget *parent = 0);
  ~Dialog();

private:
  Ui::Dialog* ui;
  myTimer mTimer;

};

#endif // DIALOG_H

dialog.cpp

#include "dialog.h"
#include "ui_dialog.h"
#include "q_debugstream.h"
#include <iostream>
#include <QTextEdit>

Dialog::Dialog(QWidget *parent) :
  QDialog(parent),
  ui(new Ui::Dialog)
{
  ui->setupUi(this);
  // this works in this .cpp file but not in mytimer.cpp when trying something similar
  ui->someQTextEdit->setTextInteractionFlags(ui->someQTextEdit->textInteractionFlags() | Qt::TextEditable); 

  myTimer mTimer;

}

Dialog::~Dialog()
{
  delete ui;
}

mytimer.h

#ifndef MYTIMER_H
#define MYTIMER_H
#include <QtCore>

class myTimer : public QObject
{
  Q_OBJECT

public:
  myTimer();
  QTimer* timer;

public slots:
  void mySlot();
};

#endif // MYTIMER_H

mytimer.cpp

#include "mytimer.h"
#include <QDebug>
#include <iostream>
#include <QTextEdit>
#include <QGraphicsOpacityEffect>
#include <QGraphicsItem>
#include <QPropertyAnimation>
#include <QTime>
#include "ui_dialog.h"
#include "dialog.h"

myTimer::myTimer()
{
  timer = new QTimer(this);
  connect(timer,SIGNAL(timeout()),this,SLOT(mySlot()));

  timer->start(5000);
}

void myTimer::mySlot(){

  QGraphicsOpacityEffect *eff = new QGraphicsOpacityEffect(this);
  ui->someQTextEdit->setGraphicsEffect(eff);
  QPropertyAnimation* a = new QPropertyAnimation(eff,"opacity");
  a->setDuration(350);
  a->setStartValue(1);
  a->setEndValue(0);
  a->setEasingCurve(QEasingCurve::OutBack);
  a->start(QPropertyAnimation::DeleteWhenStopped);    
}

问题在于ui->someQTextEdit->setGraphicsEffect(eff);行。我得到的错误告诉我,ui未在此范围内声明。 someQTextEdit是指我在设计器中创建对话框时创建的QTextEdit小部件。我需要在mytimer.cpp中执行哪些操作才能访问someQTextEdit(在对话框的ui_dialog.h文件中定义,该文件是由于使用设计器而生成的。)

提前致谢。

1 个答案:

答案 0 :(得分:1)

您的计时器用作堆栈上不在堆上的本地变量。因此,当Dialog::Dialog构造函数结束其执行时,此对象会立即被销毁(C ++的基础知识)。

无论如何,你不需要自定义计时器。使用QProperty动画。