我有一个需要访问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
文件中定义,该文件是由于使用设计器而生成的。)
提前致谢。
答案 0 :(得分:1)
您的计时器用作堆栈上不在堆上的本地变量。因此,当Dialog::Dialog
构造函数结束其执行时,此对象会立即被销毁(C ++的基础知识)。
无论如何,你不需要自定义计时器。使用QProperty
动画。