QPrinterInfo - Fix isNull() by fixing constructors
The QPrinterInfo copy and QPrinter constructors and the assignment operator were not taking the shared_null into account, and so any use of them resulted in a new null QPrinterInfo different to shared_null, which lead to isNull() always returning true in anything other than the simplest use case. While fixing this also make the shared_null a Q_GLOBAL_STATIC. Task-number: QTBUG-21087 Change-Id: I0beb24088208e9ed58d21ca26b0c8d00b02e5b8f Reviewed-by: Gunnar Sletta <gunnar.sletta@digia.com>
This commit is contained in:
parent
42fa59b151
commit
db4afbef7d
@ -35,8 +35,17 @@
|
||||
|
||||
QT_BEGIN_NAMESPACE
|
||||
|
||||
QPrinterInfoPrivate QPrinterInfoPrivate::shared_null;
|
||||
Q_GLOBAL_STATIC(QPrinterInfoPrivate, shared_null);
|
||||
|
||||
class QPrinterInfoPrivateDeleter
|
||||
{
|
||||
public:
|
||||
static inline void cleanup(QPrinterInfoPrivate *d)
|
||||
{
|
||||
if (d != shared_null)
|
||||
delete d;
|
||||
}
|
||||
};
|
||||
|
||||
/*!
|
||||
\class QPrinterInfo
|
||||
@ -83,7 +92,7 @@ QPrinterInfoPrivate QPrinterInfoPrivate::shared_null;
|
||||
\sa isNull()
|
||||
*/
|
||||
QPrinterInfo::QPrinterInfo()
|
||||
: d_ptr(&QPrinterInfoPrivate::shared_null)
|
||||
: d_ptr(shared_null)
|
||||
{
|
||||
}
|
||||
|
||||
@ -91,7 +100,7 @@ QPrinterInfo::QPrinterInfo()
|
||||
Constructs a copy of \a other.
|
||||
*/
|
||||
QPrinterInfo::QPrinterInfo(const QPrinterInfo &other)
|
||||
: d_ptr(new QPrinterInfoPrivate(*other.d_ptr))
|
||||
: d_ptr((other.d_ptr.data() == shared_null) ? shared_null : new QPrinterInfoPrivate(*other.d_ptr))
|
||||
{
|
||||
}
|
||||
|
||||
@ -99,12 +108,15 @@ QPrinterInfo::QPrinterInfo(const QPrinterInfo &other)
|
||||
Constructs a QPrinterInfo object from \a printer.
|
||||
*/
|
||||
QPrinterInfo::QPrinterInfo(const QPrinter &printer)
|
||||
: d_ptr(&QPrinterInfoPrivate::shared_null)
|
||||
: d_ptr(shared_null)
|
||||
{
|
||||
QPlatformPrinterSupport *ps = QPlatformPrinterSupportPlugin::get();
|
||||
if (ps) {
|
||||
QPrinterInfo pi = ps->printerInfo(printer.printerName());
|
||||
d_ptr.reset(new QPrinterInfoPrivate(*pi.d_ptr));
|
||||
if (pi.d_ptr.data() == shared_null)
|
||||
d_ptr.reset(shared_null);
|
||||
else
|
||||
d_ptr.reset(new QPrinterInfoPrivate(*pi.d_ptr));
|
||||
}
|
||||
}
|
||||
|
||||
@ -130,7 +142,10 @@ QPrinterInfo::~QPrinterInfo()
|
||||
QPrinterInfo &QPrinterInfo::operator=(const QPrinterInfo &other)
|
||||
{
|
||||
Q_ASSERT(d_ptr);
|
||||
d_ptr.reset(new QPrinterInfoPrivate(*other.d_ptr));
|
||||
if (other.d_ptr.data() == shared_null)
|
||||
d_ptr.reset(shared_null);
|
||||
else
|
||||
d_ptr.reset(new QPrinterInfoPrivate(*other.d_ptr));
|
||||
return *this;
|
||||
}
|
||||
|
||||
@ -191,7 +206,7 @@ QString QPrinterInfo::makeAndModel() const
|
||||
bool QPrinterInfo::isNull() const
|
||||
{
|
||||
Q_D(const QPrinterInfo);
|
||||
return d == &QPrinterInfoPrivate::shared_null;
|
||||
return d == shared_null || d->name.isEmpty();
|
||||
}
|
||||
|
||||
/*!
|
||||
|
@ -72,8 +72,6 @@ public:
|
||||
~QPrinterInfoPrivate()
|
||||
{}
|
||||
|
||||
static QPrinterInfoPrivate shared_null;
|
||||
|
||||
QString name;
|
||||
QString description;
|
||||
QString location;
|
||||
@ -87,17 +85,6 @@ public:
|
||||
mutable QList<QPair<QString, QSizeF> > paperNames;
|
||||
};
|
||||
|
||||
|
||||
class QPrinterInfoPrivateDeleter
|
||||
{
|
||||
public:
|
||||
static inline void cleanup(QPrinterInfoPrivate *d)
|
||||
{
|
||||
if (d != &QPrinterInfoPrivate::shared_null)
|
||||
delete d;
|
||||
}
|
||||
};
|
||||
|
||||
QT_END_NAMESPACE
|
||||
|
||||
#endif // QT_NO_PRINTER
|
||||
|
@ -275,6 +275,9 @@ void tst_QPrinterInfo::testConstructors()
|
||||
QCOMPARE(null.printerName(), QString());
|
||||
QVERIFY(null.isNull());
|
||||
|
||||
QPrinterInfo null2(null);
|
||||
QVERIFY(null2.isNull());
|
||||
|
||||
QList<QPrinterInfo> printers = QPrinterInfo::availablePrinters();
|
||||
|
||||
for (int i = 0; i < printers.size(); ++i) {
|
||||
@ -295,6 +298,12 @@ void tst_QPrinterInfo::testConstructors()
|
||||
|
||||
void tst_QPrinterInfo::testAssignment()
|
||||
{
|
||||
QPrinterInfo null;
|
||||
QVERIFY(null.isNull());
|
||||
QPrinterInfo null2;
|
||||
null2 = null;
|
||||
QVERIFY(null2.isNull());
|
||||
|
||||
QList<QPrinterInfo> printers = QPrinterInfo::availablePrinters();
|
||||
|
||||
for (int i = 0; i < printers.size(); ++i) {
|
||||
|
Loading…
x
Reference in New Issue
Block a user