重新改进支持Qt4.6-Qt6.1

This commit is contained in:
feiyangqingyun
2021-05-30 15:45:43 +08:00
parent 71acdd7151
commit b2ca4d05da
286 changed files with 2571 additions and 1965 deletions

View File

@@ -1,11 +1,9 @@
HEADERS += $$PWD/qextserialport.h
HEADERS += $$PWD/qextserialport_global.h
HEADERS += $$PWD/qextserialport_p.h
HEADERS += \
$$PWD/qextserialport.h \
$$PWD/qextserialport_global.h \
$$PWD/qextserialport_p.h
SOURCES += $$PWD/qextserialport.cpp
win32 {
SOURCES += $$PWD/qextserialport_win.cpp
}
unix {
SOURCES += $$PWD/qextserialport_unix.cpp
}
win32:SOURCES += $$PWD/qextserialport_win.cpp
unix:SOURCES += $$PWD/qextserialport_unix.cpp

View File

@@ -35,26 +35,33 @@
#include <QtCore/QReadWriteLock>
#include <QtCore/QMutexLocker>
#include <QtCore/QDebug>
#include <QtCore/QRegExp>
#include <QtCore/QMetaType>
#if QT_VERSION >= QT_VERSION_CHECK(5, 0, 0)
# include <QtCore/QWinEventNotifier>
#include <QtCore/QWinEventNotifier>
#else
# include <QtCore/private/qwineventnotifier_p.h>
#include <QtCore/private/qwineventnotifier_p.h>
#endif
#if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0)
#include <QtCore5Compat/QRegExp>
#else
#include <QtCore/QRegExp>
#endif
void QextSerialPortPrivate::platformSpecificInit()
{
handle = INVALID_HANDLE_VALUE;
ZeroMemory(&overlap, sizeof(OVERLAPPED));
overlap.hEvent = CreateEvent(NULL, true, false, NULL);
winEventNotifier = 0;
bytesToWriteLock = new QReadWriteLock;
handle = INVALID_HANDLE_VALUE;
ZeroMemory(&overlap, sizeof(OVERLAPPED));
overlap.hEvent = CreateEvent(NULL, true, false, NULL);
winEventNotifier = 0;
bytesToWriteLock = new QReadWriteLock;
}
void QextSerialPortPrivate::platformSpecificDestruct()
{
CloseHandle(overlap.hEvent);
delete bytesToWriteLock;
CloseHandle(overlap.hEvent);
delete bytesToWriteLock;
}
@@ -66,108 +73,107 @@ void QextSerialPortPrivate::platformSpecificDestruct()
*/
static QString fullPortNameWin(const QString &name)
{
QRegExp rx(QLatin1String("^COM(\\d+)"));
QString fullName(name);
QRegExp rx(QLatin1String("^COM(\\d+)"));
QString fullName(name);
if (rx.indexIn(fullName) >= 0) {
fullName.prepend(QLatin1String("\\\\.\\"));
}
if (fullName.contains(rx)) {
fullName.prepend(QLatin1String("\\\\.\\"));
}
return fullName;
return fullName;
}
bool QextSerialPortPrivate::open_sys(QIODevice::OpenMode mode)
{
Q_Q(QextSerialPort);
DWORD confSize = sizeof(COMMCONFIG);
commConfig.dwSize = confSize;
DWORD dwFlagsAndAttributes = 0;
Q_Q(QextSerialPort);
DWORD confSize = sizeof(COMMCONFIG);
commConfig.dwSize = confSize;
DWORD dwFlagsAndAttributes = 0;
if (queryMode == QextSerialPort::EventDriven) {
dwFlagsAndAttributes += FILE_FLAG_OVERLAPPED;
}
if (queryMode == QextSerialPort::EventDriven) {
dwFlagsAndAttributes += FILE_FLAG_OVERLAPPED;
}
/*open the port*/
handle = CreateFileW((wchar_t *)fullPortNameWin(port).utf16(), GENERIC_READ | GENERIC_WRITE,
0, NULL, OPEN_EXISTING, dwFlagsAndAttributes, NULL);
/*open the port*/
handle = CreateFileW((wchar_t *)fullPortNameWin(port).utf16(), GENERIC_READ | GENERIC_WRITE,
0, NULL, OPEN_EXISTING, dwFlagsAndAttributes, NULL);
if (handle != INVALID_HANDLE_VALUE) {
q->setOpenMode(mode);
/*configure port settings*/
GetCommConfig(handle, &commConfig, &confSize);
GetCommState(handle, &(commConfig.dcb));
if (handle != INVALID_HANDLE_VALUE) {
q->setOpenMode(mode);
/*configure port settings*/
GetCommConfig(handle, &commConfig, &confSize);
GetCommState(handle, &(commConfig.dcb));
/*set up parameters*/
commConfig.dcb.fBinary = TRUE;
commConfig.dcb.fInX = FALSE;
commConfig.dcb.fOutX = FALSE;
commConfig.dcb.fAbortOnError = FALSE;
commConfig.dcb.fNull = FALSE;
/* Dtr default to true. See Issue 122*/
commConfig.dcb.fDtrControl = TRUE;
/*flush all settings*/
settingsDirtyFlags = DFE_ALL;
updatePortSettings();
/*set up parameters*/
commConfig.dcb.fBinary = TRUE;
commConfig.dcb.fInX = FALSE;
commConfig.dcb.fOutX = FALSE;
commConfig.dcb.fAbortOnError = FALSE;
commConfig.dcb.fNull = FALSE;
/* Dtr default to true. See Issue 122*/
commConfig.dcb.fDtrControl = TRUE;
/*flush all settings*/
settingsDirtyFlags = DFE_ALL;
updatePortSettings();
//init event driven approach
if (queryMode == QextSerialPort::EventDriven) {
if (!SetCommMask(handle, EV_TXEMPTY | EV_RXCHAR | EV_DSR)) {
QESP_WARNING() << "failed to set Comm Mask. Error code:" << GetLastError();
return false;
}
//init event driven approach
if (queryMode == QextSerialPort::EventDriven) {
if (!SetCommMask(handle, EV_TXEMPTY | EV_RXCHAR | EV_DSR)) {
QESP_WARNING() << "failed to set Comm Mask. Error code:" << GetLastError();
return false;
}
winEventNotifier = new QWinEventNotifier(overlap.hEvent, q);
qRegisterMetaType<HANDLE>("HANDLE");
q->connect(winEventNotifier, SIGNAL(activated(HANDLE)), q, SLOT(_q_onWinEvent(HANDLE)), Qt::DirectConnection);
WaitCommEvent(handle, &eventMask, &overlap);
}
winEventNotifier = new QWinEventNotifier(overlap.hEvent, q);
qRegisterMetaType<HANDLE>("HANDLE");
q->connect(winEventNotifier, SIGNAL(activated(HANDLE)), q, SLOT(_q_onWinEvent(HANDLE)), Qt::DirectConnection);
WaitCommEvent(handle, &eventMask, &overlap);
}
return true;
}
return true;
}
return false;
return false;
}
bool QextSerialPortPrivate::close_sys()
{
flush_sys();
CancelIo(handle);
flush_sys();
CancelIo(handle);
if (CloseHandle(handle)) {
handle = INVALID_HANDLE_VALUE;
}
if (CloseHandle(handle)) {
handle = INVALID_HANDLE_VALUE;
}
if (winEventNotifier) {
winEventNotifier->setEnabled(false);
winEventNotifier->deleteLater();
winEventNotifier = 0;
}
if (winEventNotifier) {
winEventNotifier->setEnabled(false);
winEventNotifier->deleteLater();
winEventNotifier = 0;
}
foreach (OVERLAPPED *o, pendingWrites) {
CloseHandle(o->hEvent);
delete o;
}
foreach (OVERLAPPED *o, pendingWrites) {
CloseHandle(o->hEvent);
delete o;
}
pendingWrites.clear();
return true;
pendingWrites.clear();
return true;
}
bool QextSerialPortPrivate::flush_sys()
{
FlushFileBuffers(handle);
return true;
FlushFileBuffers(handle);
return true;
}
qint64 QextSerialPortPrivate::bytesAvailable_sys() const
{
DWORD Errors;
COMSTAT Status;
DWORD Errors;
COMSTAT Status;
if (ClearCommError(handle, &Errors, &Status)) {
return Status.cbInQue;
}
if (ClearCommError(handle, &Errors, &Status)) {
return Status.cbInQue;
}
return (qint64) - 1;
return (qint64) - 1;
}
/*
@@ -175,23 +181,23 @@ qint64 QextSerialPortPrivate::bytesAvailable_sys() const
*/
void QextSerialPortPrivate::translateError(ulong error)
{
if (error & CE_BREAK) {
lastErr = E_BREAK_CONDITION;
} else if (error & CE_FRAME) {
lastErr = E_FRAMING_ERROR;
} else if (error & CE_IOE) {
lastErr = E_IO_ERROR;
} else if (error & CE_MODE) {
lastErr = E_INVALID_FD;
} else if (error & CE_OVERRUN) {
lastErr = E_BUFFER_OVERRUN;
} else if (error & CE_RXPARITY) {
lastErr = E_RECEIVE_PARITY_ERROR;
} else if (error & CE_RXOVER) {
lastErr = E_RECEIVE_OVERFLOW;
} else if (error & CE_TXFULL) {
lastErr = E_TRANSMIT_OVERFLOW;
}
if (error & CE_BREAK) {
lastErr = E_BREAK_CONDITION;
} else if (error & CE_FRAME) {
lastErr = E_FRAMING_ERROR;
} else if (error & CE_IOE) {
lastErr = E_IO_ERROR;
} else if (error & CE_MODE) {
lastErr = E_INVALID_FD;
} else if (error & CE_OVERRUN) {
lastErr = E_BUFFER_OVERRUN;
} else if (error & CE_RXPARITY) {
lastErr = E_RECEIVE_PARITY_ERROR;
} else if (error & CE_RXOVER) {
lastErr = E_RECEIVE_OVERFLOW;
} else if (error & CE_TXFULL) {
lastErr = E_TRANSMIT_OVERFLOW;
}
}
/*
@@ -204,30 +210,30 @@ void QextSerialPortPrivate::translateError(ulong error)
*/
qint64 QextSerialPortPrivate::readData_sys(char *data, qint64 maxSize)
{
DWORD bytesRead = 0;
bool failed = false;
DWORD bytesRead = 0;
bool failed = false;
if (queryMode == QextSerialPort::EventDriven) {
OVERLAPPED overlapRead;
ZeroMemory(&overlapRead, sizeof(OVERLAPPED));
if (queryMode == QextSerialPort::EventDriven) {
OVERLAPPED overlapRead;
ZeroMemory(&overlapRead, sizeof(OVERLAPPED));
if (!ReadFile(handle, (void *)data, (DWORD)maxSize, &bytesRead, &overlapRead)) {
if (GetLastError() == ERROR_IO_PENDING) {
GetOverlappedResult(handle, &overlapRead, &bytesRead, true);
} else {
failed = true;
}
}
} else if (!ReadFile(handle, (void *)data, (DWORD)maxSize, &bytesRead, NULL)) {
failed = true;
}
if (!ReadFile(handle, (void *)data, (DWORD)maxSize, &bytesRead, &overlapRead)) {
if (GetLastError() == ERROR_IO_PENDING) {
GetOverlappedResult(handle, &overlapRead, &bytesRead, true);
} else {
failed = true;
}
}
} else if (!ReadFile(handle, (void *)data, (DWORD)maxSize, &bytesRead, NULL)) {
failed = true;
}
if (!failed) {
return (qint64)bytesRead;
}
if (!failed) {
return (qint64)bytesRead;
}
lastErr = E_READ_FAILED;
return -1;
lastErr = E_READ_FAILED;
return -1;
}
/*
@@ -240,79 +246,79 @@ qint64 QextSerialPortPrivate::readData_sys(char *data, qint64 maxSize)
*/
qint64 QextSerialPortPrivate::writeData_sys(const char *data, qint64 maxSize)
{
DWORD bytesWritten = 0;
bool failed = false;
DWORD bytesWritten = 0;
bool failed = false;
if (queryMode == QextSerialPort::EventDriven) {
OVERLAPPED *newOverlapWrite = new OVERLAPPED;
ZeroMemory(newOverlapWrite, sizeof(OVERLAPPED));
newOverlapWrite->hEvent = CreateEvent(NULL, true, false, NULL);
if (queryMode == QextSerialPort::EventDriven) {
OVERLAPPED *newOverlapWrite = new OVERLAPPED;
ZeroMemory(newOverlapWrite, sizeof(OVERLAPPED));
newOverlapWrite->hEvent = CreateEvent(NULL, true, false, NULL);
if (WriteFile(handle, (void *)data, (DWORD)maxSize, &bytesWritten, newOverlapWrite)) {
CloseHandle(newOverlapWrite->hEvent);
delete newOverlapWrite;
} else if (GetLastError() == ERROR_IO_PENDING) {
// writing asynchronously...not an error
QWriteLocker writelocker(bytesToWriteLock);
pendingWrites.append(newOverlapWrite);
} else {
QESP_WARNING() << "QextSerialPort write error:" << GetLastError();
failed = true;
if (WriteFile(handle, (void *)data, (DWORD)maxSize, &bytesWritten, newOverlapWrite)) {
CloseHandle(newOverlapWrite->hEvent);
delete newOverlapWrite;
} else if (GetLastError() == ERROR_IO_PENDING) {
// writing asynchronously...not an error
QWriteLocker writelocker(bytesToWriteLock);
pendingWrites.append(newOverlapWrite);
} else {
QESP_WARNING() << "QextSerialPort write error:" << GetLastError();
failed = true;
if (!CancelIo(newOverlapWrite->hEvent)) {
QESP_WARNING("QextSerialPort: couldn't cancel IO");
}
if (!CancelIo(newOverlapWrite->hEvent)) {
QESP_WARNING("QextSerialPort: couldn't cancel IO");
}
if (!CloseHandle(newOverlapWrite->hEvent)) {
QESP_WARNING("QextSerialPort: couldn't close OVERLAPPED handle");
}
if (!CloseHandle(newOverlapWrite->hEvent)) {
QESP_WARNING("QextSerialPort: couldn't close OVERLAPPED handle");
}
delete newOverlapWrite;
}
} else if (!WriteFile(handle, (void *)data, (DWORD)maxSize, &bytesWritten, NULL)) {
failed = true;
}
delete newOverlapWrite;
}
} else if (!WriteFile(handle, (void *)data, (DWORD)maxSize, &bytesWritten, NULL)) {
failed = true;
}
if (!failed) {
return (qint64)bytesWritten;
}
if (!failed) {
return (qint64)bytesWritten;
}
lastErr = E_WRITE_FAILED;
return -1;
lastErr = E_WRITE_FAILED;
return -1;
}
void QextSerialPortPrivate::setDtr_sys(bool set)
{
EscapeCommFunction(handle, set ? SETDTR : CLRDTR);
EscapeCommFunction(handle, set ? SETDTR : CLRDTR);
}
void QextSerialPortPrivate::setRts_sys(bool set)
{
EscapeCommFunction(handle, set ? SETRTS : CLRRTS);
EscapeCommFunction(handle, set ? SETRTS : CLRRTS);
}
ulong QextSerialPortPrivate::lineStatus_sys(void)
{
unsigned long Status = 0, Temp = 0;
GetCommModemStatus(handle, &Temp);
unsigned long Status = 0, Temp = 0;
GetCommModemStatus(handle, &Temp);
if (Temp & MS_CTS_ON) {
Status |= LS_CTS;
}
if (Temp & MS_CTS_ON) {
Status |= LS_CTS;
}
if (Temp & MS_DSR_ON) {
Status |= LS_DSR;
}
if (Temp & MS_DSR_ON) {
Status |= LS_DSR;
}
if (Temp & MS_RING_ON) {
Status |= LS_RI;
}
if (Temp & MS_RING_ON) {
Status |= LS_RI;
}
if (Temp & MS_RLSD_ON) {
Status |= LS_DCD;
}
if (Temp & MS_RLSD_ON) {
Status |= LS_DCD;
}
return Status;
return Status;
}
/*
@@ -320,157 +326,157 @@ ulong QextSerialPortPrivate::lineStatus_sys(void)
*/
void QextSerialPortPrivate::_q_onWinEvent(HANDLE h)
{
Q_Q(QextSerialPort);
Q_Q(QextSerialPort);
if (h == overlap.hEvent) {
if (eventMask & EV_RXCHAR) {
if (q->sender() != q && bytesAvailable_sys() > 0) {
_q_canRead();
}
}
if (h == overlap.hEvent) {
if (eventMask & EV_RXCHAR) {
if (q->sender() != q && bytesAvailable_sys() > 0) {
_q_canRead();
}
}
if (eventMask & EV_TXEMPTY) {
/*
A write completed. Run through the list of OVERLAPPED writes, and if
they completed successfully, take them off the list and delete them.
Otherwise, leave them on there so they can finish.
*/
qint64 totalBytesWritten = 0;
QList<OVERLAPPED *> overlapsToDelete;
if (eventMask & EV_TXEMPTY) {
/*
A write completed. Run through the list of OVERLAPPED writes, and if
they completed successfully, take them off the list and delete them.
Otherwise, leave them on there so they can finish.
*/
qint64 totalBytesWritten = 0;
QList<OVERLAPPED *> overlapsToDelete;
foreach (OVERLAPPED *o, pendingWrites) {
DWORD numBytes = 0;
foreach (OVERLAPPED *o, pendingWrites) {
DWORD numBytes = 0;
if (GetOverlappedResult(handle, o, &numBytes, false)) {
overlapsToDelete.append(o);
totalBytesWritten += numBytes;
} else if (GetLastError() != ERROR_IO_INCOMPLETE) {
overlapsToDelete.append(o);
QESP_WARNING() << "CommEvent overlapped write error:" << GetLastError();
}
}
if (GetOverlappedResult(handle, o, &numBytes, false)) {
overlapsToDelete.append(o);
totalBytesWritten += numBytes;
} else if (GetLastError() != ERROR_IO_INCOMPLETE) {
overlapsToDelete.append(o);
QESP_WARNING() << "CommEvent overlapped write error:" << GetLastError();
}
}
if (q->sender() != q && totalBytesWritten > 0) {
QWriteLocker writelocker(bytesToWriteLock);
Q_EMIT q->bytesWritten(totalBytesWritten);
}
if (q->sender() != q && totalBytesWritten > 0) {
QWriteLocker writelocker(bytesToWriteLock);
Q_EMIT q->bytesWritten(totalBytesWritten);
}
foreach (OVERLAPPED *o, overlapsToDelete) {
OVERLAPPED *toDelete = pendingWrites.takeAt(pendingWrites.indexOf(o));
CloseHandle(toDelete->hEvent);
delete toDelete;
}
}
foreach (OVERLAPPED *o, overlapsToDelete) {
OVERLAPPED *toDelete = pendingWrites.takeAt(pendingWrites.indexOf(o));
CloseHandle(toDelete->hEvent);
delete toDelete;
}
}
if (eventMask & EV_DSR) {
if (lineStatus_sys() & LS_DSR) {
Q_EMIT q->dsrChanged(true);
} else {
Q_EMIT q->dsrChanged(false);
}
}
}
if (eventMask & EV_DSR) {
if (lineStatus_sys() & LS_DSR) {
Q_EMIT q->dsrChanged(true);
} else {
Q_EMIT q->dsrChanged(false);
}
}
}
WaitCommEvent(handle, &eventMask, &overlap);
WaitCommEvent(handle, &eventMask, &overlap);
}
void QextSerialPortPrivate::updatePortSettings()
{
if (!q_ptr->isOpen() || !settingsDirtyFlags) {
return;
}
if (!q_ptr->isOpen() || !settingsDirtyFlags) {
return;
}
//fill struct : COMMCONFIG
if (settingsDirtyFlags & DFE_BaudRate) {
commConfig.dcb.BaudRate = settings.BaudRate;
}
//fill struct : COMMCONFIG
if (settingsDirtyFlags & DFE_BaudRate) {
commConfig.dcb.BaudRate = settings.BaudRate;
}
if (settingsDirtyFlags & DFE_Parity) {
commConfig.dcb.Parity = (BYTE)settings.Parity;
commConfig.dcb.fParity = (settings.Parity == PAR_NONE) ? FALSE : TRUE;
}
if (settingsDirtyFlags & DFE_Parity) {
commConfig.dcb.Parity = (BYTE)settings.Parity;
commConfig.dcb.fParity = (settings.Parity == PAR_NONE) ? FALSE : TRUE;
}
if (settingsDirtyFlags & DFE_DataBits) {
commConfig.dcb.ByteSize = (BYTE)settings.DataBits;
}
if (settingsDirtyFlags & DFE_DataBits) {
commConfig.dcb.ByteSize = (BYTE)settings.DataBits;
}
if (settingsDirtyFlags & DFE_StopBits) {
switch (settings.StopBits) {
case STOP_1:
commConfig.dcb.StopBits = ONESTOPBIT;
break;
if (settingsDirtyFlags & DFE_StopBits) {
switch (settings.StopBits) {
case STOP_1:
commConfig.dcb.StopBits = ONESTOPBIT;
break;
case STOP_1_5:
commConfig.dcb.StopBits = ONE5STOPBITS;
break;
case STOP_1_5:
commConfig.dcb.StopBits = ONE5STOPBITS;
break;
case STOP_2:
commConfig.dcb.StopBits = TWOSTOPBITS;
break;
}
}
case STOP_2:
commConfig.dcb.StopBits = TWOSTOPBITS;
break;
}
}
if (settingsDirtyFlags & DFE_Flow) {
switch (settings.FlowControl) {
/*no flow control*/
case FLOW_OFF:
commConfig.dcb.fOutxCtsFlow = FALSE;
commConfig.dcb.fRtsControl = RTS_CONTROL_DISABLE;
commConfig.dcb.fInX = FALSE;
commConfig.dcb.fOutX = FALSE;
break;
if (settingsDirtyFlags & DFE_Flow) {
switch (settings.FlowControl) {
/*no flow control*/
case FLOW_OFF:
commConfig.dcb.fOutxCtsFlow = FALSE;
commConfig.dcb.fRtsControl = RTS_CONTROL_DISABLE;
commConfig.dcb.fInX = FALSE;
commConfig.dcb.fOutX = FALSE;
break;
/*software (XON/XOFF) flow control*/
case FLOW_XONXOFF:
commConfig.dcb.fOutxCtsFlow = FALSE;
commConfig.dcb.fRtsControl = RTS_CONTROL_DISABLE;
commConfig.dcb.fInX = TRUE;
commConfig.dcb.fOutX = TRUE;
break;
/*software (XON/XOFF) flow control*/
case FLOW_XONXOFF:
commConfig.dcb.fOutxCtsFlow = FALSE;
commConfig.dcb.fRtsControl = RTS_CONTROL_DISABLE;
commConfig.dcb.fInX = TRUE;
commConfig.dcb.fOutX = TRUE;
break;
/*hardware flow control*/
case FLOW_HARDWARE:
commConfig.dcb.fOutxCtsFlow = TRUE;
commConfig.dcb.fRtsControl = RTS_CONTROL_HANDSHAKE;
commConfig.dcb.fInX = FALSE;
commConfig.dcb.fOutX = FALSE;
break;
}
}
/*hardware flow control*/
case FLOW_HARDWARE:
commConfig.dcb.fOutxCtsFlow = TRUE;
commConfig.dcb.fRtsControl = RTS_CONTROL_HANDSHAKE;
commConfig.dcb.fInX = FALSE;
commConfig.dcb.fOutX = FALSE;
break;
}
}
//fill struct : COMMTIMEOUTS
if (settingsDirtyFlags & DFE_TimeOut) {
if (queryMode != QextSerialPort::EventDriven) {
int millisec = settings.Timeout_Millisec;
//fill struct : COMMTIMEOUTS
if (settingsDirtyFlags & DFE_TimeOut) {
if (queryMode != QextSerialPort::EventDriven) {
int millisec = settings.Timeout_Millisec;
if (millisec == -1) {
commTimeouts.ReadIntervalTimeout = MAXDWORD;
commTimeouts.ReadTotalTimeoutConstant = 0;
} else {
commTimeouts.ReadIntervalTimeout = millisec;
commTimeouts.ReadTotalTimeoutConstant = millisec;
}
if (millisec == -1) {
commTimeouts.ReadIntervalTimeout = MAXDWORD;
commTimeouts.ReadTotalTimeoutConstant = 0;
} else {
commTimeouts.ReadIntervalTimeout = millisec;
commTimeouts.ReadTotalTimeoutConstant = millisec;
}
commTimeouts.ReadTotalTimeoutMultiplier = 0;
commTimeouts.WriteTotalTimeoutMultiplier = millisec;
commTimeouts.WriteTotalTimeoutConstant = 0;
} else {
commTimeouts.ReadIntervalTimeout = MAXDWORD;
commTimeouts.ReadTotalTimeoutMultiplier = 0;
commTimeouts.ReadTotalTimeoutConstant = 0;
commTimeouts.WriteTotalTimeoutMultiplier = 0;
commTimeouts.WriteTotalTimeoutConstant = 0;
}
}
commTimeouts.ReadTotalTimeoutMultiplier = 0;
commTimeouts.WriteTotalTimeoutMultiplier = millisec;
commTimeouts.WriteTotalTimeoutConstant = 0;
} else {
commTimeouts.ReadIntervalTimeout = MAXDWORD;
commTimeouts.ReadTotalTimeoutMultiplier = 0;
commTimeouts.ReadTotalTimeoutConstant = 0;
commTimeouts.WriteTotalTimeoutMultiplier = 0;
commTimeouts.WriteTotalTimeoutConstant = 0;
}
}
if (settingsDirtyFlags & DFE_Settings_Mask) {
SetCommConfig(handle, &commConfig, sizeof(COMMCONFIG));
}
if (settingsDirtyFlags & DFE_Settings_Mask) {
SetCommConfig(handle, &commConfig, sizeof(COMMCONFIG));
}
if ((settingsDirtyFlags & DFE_TimeOut)) {
SetCommTimeouts(handle, &commTimeouts);
}
if ((settingsDirtyFlags & DFE_TimeOut)) {
SetCommTimeouts(handle, &commTimeouts);
}
settingsDirtyFlags = 0;
settingsDirtyFlags = 0;
}

View File

@@ -11,8 +11,7 @@ HEADERS += \
$$PWD/mimetext.h \
$$PWD/quotedprintable.h \
$$PWD/smtpclient.h \
$$PWD/smtpmime.h \
$$PWD/sendemailthread.h
$$PWD/smtpmime.h
SOURCES += \
$$PWD/emailaddress.cpp \
@@ -26,5 +25,4 @@ SOURCES += \
$$PWD/mimepart.cpp \
$$PWD/mimetext.cpp \
$$PWD/quotedprintable.cpp \
$$PWD/smtpclient.cpp \
$$PWD/sendemailthread.cpp
$$PWD/smtpclient.cpp

View File

@@ -0,0 +1,223 @@
#include "mimemessage.h"
#include <QDateTime>
#include "quotedprintable.h"
#include <typeinfo>
MimeMessage::MimeMessage(bool createAutoMimeContent) :
hEncoding(MimePart::_8Bit)
{
if (createAutoMimeContent) {
this->content = new MimeMultiPart();
}
}
MimeMessage::~MimeMessage()
{
}
MimePart &MimeMessage::getContent()
{
return *content;
}
void MimeMessage::setContent(MimePart *content)
{
this->content = content;
}
void MimeMessage::setSender(EmailAddress *e)
{
this->sender = e;
}
void MimeMessage::addRecipient(EmailAddress *rcpt, RecipientType type)
{
switch (type) {
case To:
recipientsTo << rcpt;
break;
case Cc:
recipientsCc << rcpt;
break;
case Bcc:
recipientsBcc << rcpt;
break;
}
}
void MimeMessage::addTo(EmailAddress *rcpt)
{
this->recipientsTo << rcpt;
}
void MimeMessage::addCc(EmailAddress *rcpt)
{
this->recipientsCc << rcpt;
}
void MimeMessage::addBcc(EmailAddress *rcpt)
{
this->recipientsBcc << rcpt;
}
void MimeMessage::setSubject(const QString &subject)
{
this->subject = subject;
}
void MimeMessage::addPart(MimePart *part)
{
if (typeid(*content) == typeid(MimeMultiPart)) {
((MimeMultiPart *) content)->addPart(part);
};
}
void MimeMessage::setHeaderEncoding(MimePart::Encoding hEnc)
{
this->hEncoding = hEnc;
}
const EmailAddress &MimeMessage::getSender() const
{
return *sender;
}
const QList<EmailAddress *> &MimeMessage::getRecipients(RecipientType type) const
{
switch (type) {
default:
case To:
return recipientsTo;
case Cc:
return recipientsCc;
case Bcc:
return recipientsBcc;
}
}
const QString &MimeMessage::getSubject() const
{
return subject;
}
const QList<MimePart *> &MimeMessage::getParts() const
{
if (typeid(*content) == typeid(MimeMultiPart)) {
return ((MimeMultiPart *) content)->getParts();
} else {
QList<MimePart *> *res = new QList<MimePart *>();
res->append(content);
return *res;
}
}
QString MimeMessage::toString()
{
QString mime;
mime = "From:";
QByteArray name = sender->getName().toUtf8();
if (name != "") {
switch (hEncoding) {
case MimePart::Base64:
mime += " =?utf-8?B?" + QByteArray().append(name).toBase64() + "?=";
break;
case MimePart::QuotedPrintable:
mime += " =?utf-8?Q?" + QuotedPrintable::encode(QByteArray().append(name)).replace(' ', "_").replace(':', "=3A") + "?=";
break;
default:
mime += " " + name;
}
}
mime += " <" + sender->getAddress() + ">\r\n";
mime += "To:";
QList<EmailAddress *>::iterator it;
int i;
for (i = 0, it = recipientsTo.begin(); it != recipientsTo.end(); ++it, ++i) {
if (i != 0) {
mime += ",";
}
QByteArray name = (*it)->getName().toUtf8();
if (name != "") {
switch (hEncoding) {
case MimePart::Base64:
mime += " =?utf-8?B?" + QByteArray().append(name).toBase64() + "?=";
break;
case MimePart::QuotedPrintable:
mime += " =?utf-8?Q?" + QuotedPrintable::encode(QByteArray().append(name)).replace(' ', "_").replace(':', "=3A") + "?=";
break;
default:
mime += " " + name;
}
}
mime += " <" + (*it)->getAddress() + ">";
}
mime += "\r\n";
if (recipientsCc.size() != 0) {
mime += "Cc:";
}
for (i = 0, it = recipientsCc.begin(); it != recipientsCc.end(); ++it, ++i) {
if (i != 0) {
mime += ",";
}
QByteArray name = (*it)->getName().toUtf8();
if (name != "") {
switch (hEncoding) {
case MimePart::Base64:
mime += " =?utf-8?B?" + QByteArray().append(name).toBase64() + "?=";
break;
case MimePart::QuotedPrintable:
mime += " =?utf-8?Q?" + QuotedPrintable::encode(QByteArray().append(name)).replace(' ', "_").replace(':', "=3A") + "?=";
break;
default:
mime += " " + name;
}
}
mime += " <" + (*it)->getAddress() + ">";
}
if (recipientsCc.size() != 0) {
mime += "\r\n";
}
mime += "Subject: ";
switch (hEncoding) {
case MimePart::Base64:
mime += "=?utf-8?B?" + QByteArray().append(subject.toUtf8()).toBase64() + "?=";
break;
case MimePart::QuotedPrintable:
mime += "=?utf-8?Q?" + QuotedPrintable::encode(QByteArray().append(subject.toUtf8())).replace(' ', "_").replace(':', "=3A") + "?=";
break;
default:
mime += subject;
}
mime += "\r\n";
mime += "MIME-Version: 1.0\r\n";
mime += content->toString();
return mime;
}

View File

@@ -0,0 +1,66 @@
#include "mimemultipart.h"
#include "stdlib.h"
#include <QTime>
#include <QCryptographicHash>
const QString MULTI_PART_NAMES[] = {
"multipart/mixed", // Mixed
"multipart/digest", // Digest
"multipart/alternative", // Alternative
"multipart/related", // Related
"multipart/report", // Report
"multipart/signed", // Signed
"multipart/encrypted" // Encrypted
};
MimeMultiPart::MimeMultiPart(MultiPartType type)
{
this->type = type;
this->cType = MULTI_PART_NAMES[this->type];
this->cEncoding = _8Bit;
QCryptographicHash md5(QCryptographicHash::Md5);
md5.addData(QByteArray().append(rand()));
cBoundary = md5.result().toHex();
}
MimeMultiPart::~MimeMultiPart()
{
}
void MimeMultiPart::addPart(MimePart *part)
{
parts.append(part);
}
const QList<MimePart *> &MimeMultiPart::getParts() const
{
return parts;
}
void MimeMultiPart::prepare()
{
QList<MimePart *>::iterator it;
content = "";
for (it = parts.begin(); it != parts.end(); it++) {
content += "--" + cBoundary.toUtf8() + "\r\n";
(*it)->prepare();
content += (*it)->toString().toUtf8();
};
content += "--" + cBoundary.toUtf8() + "--\r\n";
MimePart::prepare();
}
void MimeMultiPart::setMimeType(const MultiPartType type)
{
this->type = type;
this->cType = MULTI_PART_NAMES[type];
}
MimeMultiPart::MultiPartType MimeMultiPart::getMimeType() const
{
return type;
}

View File

@@ -142,7 +142,7 @@ void MimePart::prepare()
break;
}
if (cId != 0) {
if (cId.toInt() != 0) {
mimeString.append("Content-ID: <").append(cId).append(">\r\n");
}

View File

@@ -23,6 +23,6 @@ const QString &MimeText::getText() const
void MimeText::prepare()
{
this->content.clear();
this->content.append(text);
this->content.append(text.toUtf8());
MimePart::prepare();
}

View File

@@ -222,7 +222,7 @@ bool SmtpClient::login(const QString &user, const QString &password, AuthMethod
try {
if (method == AuthPlain) {
// Sending command: AUTH PLAIN base64('\0' + username + '\0' + password)
sendMessage("AUTH PLAIN " + QByteArray().append((char) 0).append(user).append((char) 0).append(password).toBase64());
sendMessage("AUTH PLAIN " + QByteArray().append((char) 0).append(user.toUtf8()).append((char) 0).append(password.toUtf8()).toBase64());
// Wait for the server's response
waitForResponse();
@@ -245,7 +245,7 @@ bool SmtpClient::login(const QString &user, const QString &password, AuthMethod
}
// Send the username in base64
sendMessage(QByteArray().append(user).toBase64());
sendMessage(QByteArray().append(user.toUtf8()).toBase64());
// Wait for 334
waitForResponse();
@@ -256,7 +256,7 @@ bool SmtpClient::login(const QString &user, const QString &password, AuthMethod
}
// Send the password in base64
sendMessage(QByteArray().append(password).toBase64());
sendMessage(QByteArray().append(password.toUtf8()).toBase64());
// Wait for the server's responce
waitForResponse();
@@ -354,7 +354,7 @@ void SmtpClient::quit()
sendMessage("QUIT");
}
void SmtpClient::waitForResponse() throw (ResponseTimeoutException)
void SmtpClient::waitForResponse()
{
do {
if (!socket->waitForReadyRead(responseTimeout)) {

View File

@@ -92,7 +92,7 @@ protected:
int responseCode;
class ResponseTimeoutException {};
void waitForResponse() throw (ResponseTimeoutException);
void waitForResponse();
void sendMessage(const QString &text);
signals:

View File

@@ -24,7 +24,6 @@ SUBDIRS += maskwidget #遮罩层窗体
SUBDIRS += battery #电池电量控件
SUBDIRS += lineeditnext #文本框回车焦点下移
SUBDIRS += zhtopy #汉字转拼音
SUBDIRS += qwtdemo #qwt的源码版本无需插件直接源码集成到你的项目即可
SUBDIRS += devicebutton #设备按钮地图效果
SUBDIRS += mouseline #鼠标定位十字线
SUBDIRS += emailtool #邮件发送工具
@@ -36,7 +35,6 @@ SUBDIRS += imageswitch #图片开关控件
SUBDIRS += netserver #网络中转服务器
SUBDIRS += base64 #图片文字base64互换
SUBDIRS += smoothcurve #平滑曲线
SUBDIRS += imageviewwindow #图片预览查看
win32 {
SUBDIRS += ffmpegdemo #视频流播放ffmpeg内核
@@ -47,5 +45,12 @@ SUBDIRS += miniblink #miniblink示例
#如果你电脑对应的Qt版本有webkit或者webengine组件可以自行打开
#SUBDIRS += echartgauge #echart仪表盘含交互支持webkit及webengine
#designer项目只支持Qt4,如果是Qt4可以自行打开
lessThan(QT_MAJOR_VERSION, 4) {
#SUBDIRS += designer #QtDesigner4源码
}
#qwt项目需要等官方适配了qwt组件才能适配
lessThan(QT_MAJOR_VERSION, 6) {
SUBDIRS += qwtdemo #qwt的源码版本无需插件直接源码集成到你的项目即可
}

View File

@@ -7,6 +7,7 @@
QT += core gui
greaterThan(QT_MAJOR_VERSION, 4): QT += widgets
greaterThan(QT_MAJOR_VERSION, 5): QT += core5compat
TARGET = base64
TEMPLATE = app

View File

@@ -128,11 +128,13 @@ void Battery::updateValue()
if (isForward) {
currentValue -= step;
if (currentValue <= value) {
currentValue = value;
timer->stop();
}
} else {
currentValue += step;
if (currentValue >= value) {
currentValue = value;
timer->stop();
}
}

View File

@@ -21,6 +21,7 @@ class Battery : public QWidget
{
Q_OBJECT
Q_PROPERTY(double minValue READ getMinValue WRITE setMinValue)
Q_PROPERTY(double maxValue READ getMaxValue WRITE setMaxValue)
Q_PROPERTY(double value READ getValue WRITE setValue)

View File

@@ -7,6 +7,7 @@
QT += core gui
greaterThan(QT_MAJOR_VERSION, 4): QT += widgets
greaterThan(QT_MAJOR_VERSION, 5): QT += core5compat
TARGET = battery
TEMPLATE = app

View File

@@ -7,6 +7,7 @@
QT += core gui
greaterThan(QT_MAJOR_VERSION, 4): QT += widgets
greaterThan(QT_MAJOR_VERSION, 5): QT += core5compat
TARGET = bgdemo
TEMPLATE = app

View File

@@ -6,13 +6,18 @@
#include "qlabel.h"
#include "qlineedit.h"
#include "qapplication.h"
#include "qdesktopwidget.h"
#include "qtimer.h"
#include "qevent.h"
#include "qdebug.h"
#if (QT_VERSION > QT_VERSION_CHECK(5,0,0))
#if (QT_VERSION >= QT_VERSION_CHECK(5,0,0))
#include "qscreen.h"
#define deskGeometry qApp->primaryScreen()->geometry()
#define deskGeometry2 qApp->primaryScreen()->availableGeometry()
#else
#include "qdesktopwidget.h"
#define deskGeometry qApp->desktop()->geometry()
#define deskGeometry2 qApp->desktop()->availableGeometry()
#endif
ColorWidget *ColorWidget::instance = 0;
@@ -130,11 +135,11 @@ void ColorWidget::showColorValue()
int y = QCursor::pos().y();
txtPoint->setText(tr("x:%1 y:%2").arg(x).arg(y));
#if (QT_VERSION <= QT_VERSION_CHECK(5,0,0))
QPixmap pixmap = QPixmap::grabWindow(QApplication::desktop()->winId(), x, y, 2, 2);
#if (QT_VERSION < QT_VERSION_CHECK(5,0,0))
QPixmap pixmap = QPixmap::grabWindow(qApp->desktop()->winId(), x, y, 2, 2);
#else
QScreen *screen = QApplication::primaryScreen();
QPixmap pixmap = screen->grabWindow(QApplication::desktop()->winId(), x, y, 2, 2);
QScreen *screen = qApp->primaryScreen();
QPixmap pixmap = screen->grabWindow(0, x, y, 2, 2);
#endif
int red, green, blue;

View File

@@ -7,6 +7,7 @@
QT += core gui
greaterThan(QT_MAJOR_VERSION, 4): QT += widgets
greaterThan(QT_MAJOR_VERSION, 5): QT += core5compat
TARGET = colorwidget
TEMPLATE = app

View File

@@ -9,7 +9,7 @@ int main(int argc, char *argv[])
QApplication a(argc, argv);
a.setFont(QFont("Microsoft Yahei", 9));
#if (QT_VERSION <= QT_VERSION_CHECK(5,0,0))
#if (QT_VERSION < QT_VERSION_CHECK(5,0,0))
#if _MSC_VER
QTextCodec *codec = QTextCodec::codecForName("gbk");
#else

View File

@@ -7,6 +7,7 @@
QT += core gui network
greaterThan(QT_MAJOR_VERSION, 4): QT += widgets
greaterThan(QT_MAJOR_VERSION, 5): QT += core5compat
TARGET = comtool
TEMPLATE = app

View File

@@ -6,6 +6,9 @@
#include <QtWidgets>
#endif
#include "appconfig.h"
#if (QT_VERSION >= QT_VERSION_CHECK(6,0,0))
#include <QtCore5Compat>
#endif
#pragma execution_character_set("utf-8")
#include "appconfig.h"

View File

@@ -34,21 +34,21 @@ IconFont::IconFont(QObject *parent) : QObject(parent)
}
}
void IconFont::setIcon(QLabel *lab, const QChar &icon, quint32 size)
void IconFont::setIcon(QLabel *lab, int icon, quint32 size)
{
iconFont.setPixelSize(size);
lab->setFont(iconFont);
lab->setText(icon);
lab->setText((QChar)icon);
}
void IconFont::setIcon(QAbstractButton *btn, const QChar &icon, quint32 size)
void IconFont::setIcon(QAbstractButton *btn, int icon, quint32 size)
{
iconFont.setPixelSize(size);
btn->setFont(iconFont);
btn->setText(icon);
btn->setText((QChar)icon);
}
QPixmap IconFont::getPixmap(const QColor &color, const QChar &icon, quint32 size,
QPixmap IconFont::getPixmap(const QColor &color, int icon, quint32 size,
quint32 pixWidth, quint32 pixHeight, int flags)
{
QPixmap pix(pixWidth, pixHeight);
@@ -61,7 +61,7 @@ QPixmap IconFont::getPixmap(const QColor &color, const QChar &icon, quint32 size
iconFont.setPixelSize(size);
painter.setFont(iconFont);
painter.drawText(pix.rect(), flags, icon);
painter.drawText(pix.rect(), flags, (QChar)icon);
painter.end();
return pix;
@@ -90,16 +90,16 @@ void IconFont::setStyle(QWidget *widget, const QString &type, int borderWidth, c
QString strBorder;
if (type == "top") {
strBorder = QString("border-width:%1px 0px 0px 0px;padding:%1px %2px %2px %2px;")
.arg(borderWidth).arg(borderWidth * 2);
.arg(borderWidth).arg(borderWidth * 2);
} else if (type == "right") {
strBorder = QString("border-width:0px %1px 0px 0px;padding:%2px %1px %2px %2px;")
.arg(borderWidth).arg(borderWidth * 2);
.arg(borderWidth).arg(borderWidth * 2);
} else if (type == "bottom") {
strBorder = QString("border-width:0px 0px %1px 0px;padding:%2px %2px %1px %2px;")
.arg(borderWidth).arg(borderWidth * 2);
.arg(borderWidth).arg(borderWidth * 2);
} else if (type == "left") {
strBorder = QString("border-width:0px 0px 0px %1px;padding:%2px %2px %2px %1px;")
.arg(borderWidth).arg(borderWidth * 2);
.arg(borderWidth).arg(borderWidth * 2);
}
QStringList qss;
@@ -115,7 +115,7 @@ void IconFont::setStyle(QWidget *widget, const QString &type, int borderWidth, c
widget->setStyleSheet(qss.join(""));
}
void IconFont::setStyle(QWidget *widget, QList<QToolButton *> btns, QList<QChar> icons,
void IconFont::setStyle(QWidget *widget, QList<QToolButton *> btns, QList<int> icons,
quint32 iconSize, quint32 iconWidth, quint32 iconHeight,
const QString &type, int borderWidth, const QString &borderColor,
const QString &normalBgColor, const QString &darkBgColor,
@@ -130,16 +130,16 @@ void IconFont::setStyle(QWidget *widget, QList<QToolButton *> btns, QList<QChar>
QString strBorder;
if (type == "top") {
strBorder = QString("border-width:%1px 0px 0px 0px;padding:%1px %2px %2px %2px;")
.arg(borderWidth).arg(borderWidth * 2);
.arg(borderWidth).arg(borderWidth * 2);
} else if (type == "right") {
strBorder = QString("border-width:0px %1px 0px 0px;padding:%2px %1px %2px %2px;")
.arg(borderWidth).arg(borderWidth * 2);
.arg(borderWidth).arg(borderWidth * 2);
} else if (type == "bottom") {
strBorder = QString("border-width:0px 0px %1px 0px;padding:%2px %2px %1px %2px;")
.arg(borderWidth).arg(borderWidth * 2);
.arg(borderWidth).arg(borderWidth * 2);
} else if (type == "left") {
strBorder = QString("border-width:0px 0px 0px %1px;padding:%2px %2px %2px %1px;")
.arg(borderWidth).arg(borderWidth * 2);
.arg(borderWidth).arg(borderWidth * 2);
}
//如果图标是左侧显示则需要让没有选中的按钮左侧也有加深的边框,颜色为背景颜色
@@ -168,10 +168,11 @@ void IconFont::setStyle(QWidget *widget, QList<QToolButton *> btns, QList<QChar>
widget->setStyleSheet(qss.join(""));
//存储对应按钮对象,方便鼠标移上去的时候切换图片
for (int i = 0; i < btnCount; i++) {
//存储对应按钮对象,方便鼠标移上去的时候切换图片
QPixmap pixNormal = getPixmap(normalTextColor, icons.at(i), iconSize, iconWidth, iconHeight);
QPixmap pixDark = getPixmap(darkTextColor, icons.at(i), iconSize, iconWidth, iconHeight);
int icon = icons.at(i);
QPixmap pixNormal = getPixmap(normalTextColor, icon, iconSize, iconWidth, iconHeight);
QPixmap pixDark = getPixmap(darkTextColor, icon, iconSize, iconWidth, iconHeight);
btns.at(i)->setIcon(QIcon(pixNormal));
btns.at(i)->setIconSize(QSize(iconWidth, iconHeight));
@@ -183,7 +184,7 @@ void IconFont::setStyle(QWidget *widget, QList<QToolButton *> btns, QList<QChar>
}
}
void IconFont::setStyle(QFrame *frame, QList<QToolButton *> btns, QList<QChar> icons,
void IconFont::setStyle(QFrame *frame, QList<QToolButton *> btns, QList<int> icons,
quint32 iconSize, quint32 iconWidth, quint32 iconHeight,
const QString &normalBgColor, const QString &darkBgColor,
const QString &normalTextColor, const QString &darkTextColor)
@@ -203,10 +204,11 @@ void IconFont::setStyle(QFrame *frame, QList<QToolButton *> btns, QList<QChar> i
frame->setStyleSheet(qss.join(""));
//存储对应按钮对象,方便鼠标移上去的时候切换图片
for (int i = 0; i < btnCount; i++) {
//存储对应按钮对象,方便鼠标移上去的时候切换图片
QPixmap pixNormal = getPixmap(normalTextColor, icons.at(i), iconSize, iconWidth, iconHeight);
QPixmap pixDark = getPixmap(darkTextColor, icons.at(i), iconSize, iconWidth, iconHeight);
int icon = icons.at(i);
QPixmap pixNormal = getPixmap(normalTextColor, icon, iconSize, iconWidth, iconHeight);
QPixmap pixDark = getPixmap(darkTextColor, icon, iconSize, iconWidth, iconHeight);
btns.at(i)->setIcon(QIcon(pixNormal));
btns.at(i)->setIconSize(QSize(iconWidth, iconHeight));

View File

@@ -3,7 +3,7 @@
#include <QtCore>
#include <QtGui>
#if (QT_VERSION > QT_VERSION_CHECK(5,0,0))
#if (QT_VERSION >= QT_VERSION_CHECK(5,0,0))
#include <QtWidgets>
#endif
@@ -20,9 +20,9 @@ public:
static IconFont *Instance();
explicit IconFont(QObject *parent = 0);
void setIcon(QLabel *lab, const QChar &icon, quint32 size = 12);
void setIcon(QAbstractButton *btn, const QChar &icon, quint32 size = 12);
QPixmap getPixmap(const QColor &color, const QChar &icon, quint32 size = 12,
void setIcon(QLabel *lab, int icon, quint32 size = 12);
void setIcon(QAbstractButton *btn, int icon, quint32 size = 12);
QPixmap getPixmap(const QColor &color, int icon, quint32 size = 12,
quint32 pixWidth = 15, quint32 pixHeight = 15,
int flags = Qt::AlignCenter);
@@ -38,7 +38,7 @@ public:
const QString &darkTextColor = "#FDFDFD");
//指定导航面板样式,带图标和效果切换
void setStyle(QWidget *widget, QList<QToolButton *> btns, QList<QChar> icons,
void setStyle(QWidget *widget, QList<QToolButton *> btns, QList<int> icons,
quint32 iconSize = 12, quint32 iconWidth = 15, quint32 iconHeight = 15,
const QString &type = "left", int borderWidth = 3,
const QString &borderColor = "#029FEA",
@@ -48,7 +48,7 @@ public:
const QString &darkTextColor = "#FDFDFD");
//指定导航按钮样式,带图标和效果切换
void setStyle(QFrame *frame, QList<QToolButton *> btns, QList<QChar> icons,
void setStyle(QFrame *frame, QList<QToolButton *> btns, QList<int> icons,
quint32 iconSize = 12, quint32 iconWidth = 15, quint32 iconHeight = 15,
const QString &normalBgColor = "#2FC5A2",
const QString &darkBgColor = "#3EA7E9",

View File

@@ -39,21 +39,21 @@ QFont IconHelper::getIconFont()
return this->iconFont;
}
void IconHelper::setIcon(QLabel *lab, const QChar &icon, quint32 size)
void IconHelper::setIcon(QLabel *lab, int icon, quint32 size)
{
iconFont.setPixelSize(size);
lab->setFont(iconFont);
lab->setText(icon);
lab->setText((QChar)icon);
}
void IconHelper::setIcon(QAbstractButton *btn, const QChar &icon, quint32 size)
void IconHelper::setIcon(QAbstractButton *btn, int icon, quint32 size)
{
iconFont.setPixelSize(size);
btn->setFont(iconFont);
btn->setText(icon);
btn->setText((QChar)icon);
}
QPixmap IconHelper::getPixmap(const QColor &color, const QChar &icon, quint32 size,
QPixmap IconHelper::getPixmap(const QColor &color, int icon, quint32 size,
quint32 pixWidth, quint32 pixHeight, int flags)
{
QPixmap pix(pixWidth, pixHeight);
@@ -66,7 +66,7 @@ QPixmap IconHelper::getPixmap(const QColor &color, const QChar &icon, quint32 si
iconFont.setPixelSize(size);
painter.setFont(iconFont);
painter.drawText(pix.rect(), flags, icon);
painter.drawText(pix.rect(), flags, (QChar)icon);
painter.end();
return pix;
@@ -106,7 +106,7 @@ QPixmap IconHelper::getPixmap(QToolButton *btn, int type)
return pix;
}
void IconHelper::setStyle(QFrame *frame, QList<QToolButton *> btns, QList<QChar> icons,
void IconHelper::setStyle(QFrame *frame, QList<QToolButton *> btns, QList<int> icons,
quint32 iconSize, quint32 iconWidth, quint32 iconHeight,
const QString &normalBgColor, const QString &darkBgColor,
const QString &normalTextColor, const QString &darkTextColor)
@@ -127,8 +127,9 @@ void IconHelper::setStyle(QFrame *frame, QList<QToolButton *> btns, QList<QChar>
//存储对应按钮对象,方便鼠标移上去的时候切换图片
for (int i = 0; i < btnCount; i++) {
QPixmap pixNormal = getPixmap(normalTextColor, icons.at(i), iconSize, iconWidth, iconHeight);
QPixmap pixDark = getPixmap(darkTextColor, icons.at(i), iconSize, iconWidth, iconHeight);
int icon = icons.at(i);
QPixmap pixNormal = getPixmap(normalTextColor, icon, iconSize, iconWidth, iconHeight);
QPixmap pixDark = getPixmap(darkTextColor, icon, iconSize, iconWidth, iconHeight);
QToolButton *btn = btns.at(i);
btn->setIcon(QIcon(pixNormal));
@@ -194,7 +195,7 @@ void IconHelper::removeStyle(QList<QToolButton *> btns)
}
}
void IconHelper::setStyle(QWidget *widget, QList<QToolButton *> btns, QList<QChar> icons,
void IconHelper::setStyle(QWidget *widget, QList<QToolButton *> btns, QList<int> icons,
quint32 iconSize, quint32 iconWidth, quint32 iconHeight,
const QString &type, int borderWidth, const QString &borderColor,
const QString &normalBgColor, const QString &darkBgColor,
@@ -247,8 +248,9 @@ void IconHelper::setStyle(QWidget *widget, QList<QToolButton *> btns, QList<QCha
//存储对应按钮对象,方便鼠标移上去的时候切换图片
for (int i = 0; i < btnCount; i++) {
QPixmap pixNormal = getPixmap(normalTextColor, icons.at(i), iconSize, iconWidth, iconHeight);
QPixmap pixDark = getPixmap(darkTextColor, icons.at(i), iconSize, iconWidth, iconHeight);
int icon = icons.at(i);
QPixmap pixNormal = getPixmap(normalTextColor, icon, iconSize, iconWidth, iconHeight);
QPixmap pixDark = getPixmap(darkTextColor, icon, iconSize, iconWidth, iconHeight);
QToolButton *btn = btns.at(i);
btn->setIcon(QIcon(pixNormal));
@@ -264,7 +266,7 @@ void IconHelper::setStyle(QWidget *widget, QList<QToolButton *> btns, QList<QCha
}
}
void IconHelper::setStyle(QWidget *widget, QList<QToolButton *> btns, QList<QChar> icons, const IconHelper::StyleColor &styleColor)
void IconHelper::setStyle(QWidget *widget, QList<QToolButton *> btns, QList<int> icons, const IconHelper::StyleColor &styleColor)
{
int btnCount = btns.count();
int charCount = icons.count();
@@ -320,10 +322,11 @@ void IconHelper::setStyle(QWidget *widget, QList<QToolButton *> btns, QList<QCha
//存储对应按钮对象,方便鼠标移上去的时候切换图片
for (int i = 0; i < btnCount; i++) {
QPixmap pixNormal = getPixmap(styleColor.normalTextColor, icons.at(i), iconSize, iconWidth, iconHeight);
QPixmap pixHover = getPixmap(styleColor.hoverTextColor, icons.at(i), iconSize, iconWidth, iconHeight);
QPixmap pixPressed = getPixmap(styleColor.pressedTextColor, icons.at(i), iconSize, iconWidth, iconHeight);
QPixmap pixChecked = getPixmap(styleColor.checkedTextColor, icons.at(i), iconSize, iconWidth, iconHeight);
int icon = icons.at(i);
QPixmap pixNormal = getPixmap(styleColor.normalTextColor, icon, iconSize, iconWidth, iconHeight);
QPixmap pixHover = getPixmap(styleColor.hoverTextColor, icon, iconSize, iconWidth, iconHeight);
QPixmap pixPressed = getPixmap(styleColor.pressedTextColor, icon, iconSize, iconWidth, iconHeight);
QPixmap pixChecked = getPixmap(styleColor.checkedTextColor, icon, iconSize, iconWidth, iconHeight);
QToolButton *btn = btns.at(i);
btn->setIcon(QIcon(pixNormal));

View File

@@ -3,7 +3,7 @@
#include <QtCore>
#include <QtGui>
#if (QT_VERSION > QT_VERSION_CHECK(5,0,0))
#if (QT_VERSION >= QT_VERSION_CHECK(5,0,0))
#include <QtWidgets>
#endif
@@ -24,12 +24,12 @@ public:
QFont getIconFont();
//设置图形字体到标签
void setIcon(QLabel *lab, const QChar &icon, quint32 size = 12);
void setIcon(QLabel *lab, int icon, quint32 size = 12);
//设置图形字体到按钮
void setIcon(QAbstractButton *btn, const QChar &icon, quint32 size = 12);
void setIcon(QAbstractButton *btn, int icon, quint32 size = 12);
//获取指定图形字体,可以指定文字大小,图片宽高,文字对齐
QPixmap getPixmap(const QColor &color, const QChar &icon, quint32 size = 12,
QPixmap getPixmap(const QColor &color, int icon, quint32 size = 12,
quint32 pixWidth = 15, quint32 pixHeight = 15,
int flags = Qt::AlignCenter);
@@ -38,7 +38,7 @@ public:
QPixmap getPixmap(QToolButton *btn, int type);
//指定QFrame导航按钮样式,带图标
void setStyle(QFrame *frame, QList<QToolButton *> btns, QList<QChar> icons,
void setStyle(QFrame *frame, QList<QToolButton *> btns, QList<int> icons,
quint32 iconSize = 12, quint32 iconWidth = 15, quint32 iconHeight = 15,
const QString &normalBgColor = "#2FC5A2",
const QString &darkBgColor = "#3EA7E9",
@@ -57,7 +57,7 @@ public:
void removeStyle(QList<QToolButton *> btns);
//指定QWidget导航面板样式,带图标和效果切换
void setStyle(QWidget *widget, QList<QToolButton *> btns, QList<QChar> icons,
void setStyle(QWidget *widget, QList<QToolButton *> btns, QList<int> icons,
quint32 iconSize = 12, quint32 iconWidth = 15, quint32 iconHeight = 15,
const QString &type = "left", int borderWidth = 3,
const QString &borderColor = "#029FEA",
@@ -101,7 +101,7 @@ public:
};
//指定QWidget导航面板样式,带图标和效果切换+悬停颜色+按下颜色+选中颜色
void setStyle(QWidget *widget, QList<QToolButton *> btns, QList<QChar> icons, const StyleColor &styleColor);
void setStyle(QWidget *widget, QList<QToolButton *> btns, QList<int> icons, const StyleColor &styleColor);
protected:
bool eventFilter(QObject *watched, QEvent *event);

View File

@@ -1,11 +1,11 @@
#include "quiconfig.h"
QChar QUIConfig::IconMain = 0xf072;
QChar QUIConfig::IconMenu = 0xf0d7;
QChar QUIConfig::IconMin = 0xf068;
QChar QUIConfig::IconMax = 0xf2d2;
QChar QUIConfig::IconNormal = 0xf2d0;
QChar QUIConfig::IconClose = 0xf00d;
int QUIConfig::IconMain = 0xf072;
int QUIConfig::IconMenu = 0xf0d7;
int QUIConfig::IconMin = 0xf068;
int QUIConfig::IconMax = 0xf2d2;
int QUIConfig::IconNormal = 0xf2d0;
int QUIConfig::IconClose = 0xf00d;
#ifdef __arm__
QString QUIConfig::FontName = "WenQuanYi Micro Hei";

View File

@@ -7,12 +7,12 @@ class QUIConfig
{
public:
//全局图标
static QChar IconMain; //标题栏左上角图标
static QChar IconMenu; //下拉菜单图标
static QChar IconMin; //最小化图标
static QChar IconMax; //最大化图标
static QChar IconNormal; //还原图标
static QChar IconClose; //关闭图标
static int IconMain; //标题栏左上角图标
static int IconMenu; //下拉菜单图标
static int IconMin; //最小化图标
static int IconMax; //最大化图标
static int IconNormal; //还原图标
static int IconClose; //关闭图标
//全局字体
static QString FontName; //全局字体名称

View File

@@ -256,7 +256,7 @@ QString QUIDateSelect::getEndDateTime() const
return this->endDateTime;
}
void QUIDateSelect::setIconMain(const QChar &icon, quint32 size)
void QUIDateSelect::setIconMain(int icon, quint32 size)
{
IconHelper::Instance()->setIcon(this->labIco, icon, size);
}

View File

@@ -57,7 +57,7 @@ public:
QString getEndDateTime() const;
public Q_SLOTS:
void setIconMain(const QChar &icon, quint32 size = 12);
void setIconMain(int icon, quint32 size = 12);
void setFormat(const QString &format);
};

View File

@@ -1,23 +1,24 @@
#include "quihelper.h"
QString QUIHelper::getUuid()
{
QString uuid = QUuid::createUuid().toString();
uuid = uuid.replace("{", "");
uuid = uuid.replace("}", "");
return uuid;
}
int QUIHelper::getScreenIndex()
{
//需要对多个屏幕进行处理
int screenIndex = -1;
int screenIndex = 0;
#if (QT_VERSION >= QT_VERSION_CHECK(5,0,0))
int screenCount = qApp->screens().count();
#else
int screenCount = qApp->desktop()->screenCount();
#endif
if (screenCount > 1) {
//找到当前鼠标所在屏幕
QPoint pos = QCursor::pos();
for (int i = 0; i < screenCount; ++i) {
#if (QT_VERSION >= QT_VERSION_CHECK(5,0,0))
if (qApp->screens().at(i)->geometry().contains(pos)) {
#else
if (qApp->desktop()->screenGeometry(i).contains(pos)) {
#endif
screenIndex = i;
break;
}
@@ -26,18 +27,50 @@ int QUIHelper::getScreenIndex()
return screenIndex;
}
QRect QUIHelper::getScreenRect(bool available)
{
QRect rect;
int screenIndex = QUIHelper::getScreenIndex();
if (available) {
#if (QT_VERSION >= QT_VERSION_CHECK(5,0,0))
rect = qApp->screens().at(screenIndex)->availableGeometry();
#else
rect = qApp->desktop()->availableGeometry(screenIndex);
#endif
} else {
#if (QT_VERSION >= QT_VERSION_CHECK(5,0,0))
rect = qApp->screens().at(screenIndex)->geometry();
#else
rect = qApp->desktop()->screenGeometry(screenIndex);
#endif
}
return rect;
}
int QUIHelper::deskWidth()
{
int screenIndex = QUIHelper::getScreenIndex();
int width = qApp->desktop()->availableGeometry(screenIndex).width();
return width;
return getScreenRect().width();
}
int QUIHelper::deskHeight()
{
int screenIndex = QUIHelper::getScreenIndex();
int height = qApp->desktop()->availableGeometry(screenIndex).height();
return height;
return getScreenRect().height();
}
void QUIHelper::setFormInCenter(QWidget *form)
{
int formWidth = form->width();
int formHeight = form->height();
QRect rect = getScreenRect();
int deskWidth = rect.width();
int deskHeight = rect.height();
QPoint movePoint(deskWidth / 2 - formWidth / 2 + rect.x(), deskHeight / 2 - formHeight / 2);
form->move(movePoint);
//其他系统自动最大化
#ifndef Q_OS_WIN
QTimer::singleShot(100, form, SLOT(showMaximized()));
#endif
}
QString QUIHelper::appName()
@@ -64,11 +97,98 @@ QString QUIHelper::appPath()
#endif
}
QString QUIHelper::getUuid()
{
QString uuid = QUuid::createUuid().toString();
uuid = uuid.replace("{", "");
uuid = uuid.replace("}", "");
return uuid;
}
void QUIHelper::initRand()
{
//初始化随机数种子
QTime t = QTime::currentTime();
qsrand(t.msec() + t.second() * 1000);
srand(t.msec() + t.second() * 1000);
}
void QUIHelper::newDir(const QString &dirName)
{
QString strDir = dirName;
//如果路径中包含斜杠字符则说明是绝对路径
//linux系统路径字符带有 / windows系统 路径字符带有 :/
if (!strDir.startsWith("/") && !strDir.contains(":/")) {
strDir = QString("%1/%2").arg(QUIHelper::appPath()).arg(strDir);
}
QDir dir(strDir);
if (!dir.exists()) {
dir.mkpath(strDir);
}
}
void QUIHelper::sleep(int msec)
{
if (msec > 0) {
#if (QT_VERSION < QT_VERSION_CHECK(5,7,0))
QTime endTime = QTime::currentTime().addMSecs(msec);
while (QTime::currentTime() < endTime) {
QCoreApplication::processEvents(QEventLoop::AllEvents, 100);
}
#else
QThread::msleep(msec);
#endif
}
}
void QUIHelper::setCode(bool utf8)
{
#if (QT_VERSION < QT_VERSION_CHECK(5,0,0))
#if _MSC_VER
QTextCodec *codec = QTextCodec::codecForName("gbk");
#else
QTextCodec *codec = QTextCodec::codecForName("utf-8");
#endif
QTextCodec::setCodecForLocale(codec);
QTextCodec::setCodecForCStrings(codec);
QTextCodec::setCodecForTr(codec);
#else
//如果想要控制台打印信息中文正常就注释掉这个设置
if (utf8) {
QTextCodec *codec = QTextCodec::codecForName("utf-8");
QTextCodec::setCodecForLocale(codec);
}
#endif
}
void QUIHelper::setFont(const QString &ttfFile, const QString &fontName, int fontSize)
{
QFont font;
font.setFamily(fontName);
font.setPixelSize(fontSize);
//如果存在字体文件则设备字体文件中的字体
//安卓版本和网页版本需要字体文件一起打包单独设置字体
if (!ttfFile.isEmpty()) {
QFontDatabase fontDb;
int fontId = fontDb.addApplicationFont(ttfFile);
if (fontId != -1) {
QStringList androidFont = fontDb.applicationFontFamilies(fontId);
if (androidFont.size() != 0) {
font.setFamily(androidFont.at(0));
font.setPixelSize(fontSize);
}
}
}
qApp->setFont(font);
}
void QUIHelper::setTranslator(const QString &qmFile)
{
QTranslator *translator = new QTranslator(qApp);
translator->load(qmFile);
qApp->installTranslator(translator);
}
void QUIHelper::initDb(const QString &dbName)
@@ -122,14 +242,14 @@ bool QUIHelper::checkIniFile(const QString &iniFile)
return true;
}
void QUIHelper::setIconBtn(QAbstractButton *btn, const QString &png, const QChar &str)
void QUIHelper::setIconBtn(QAbstractButton *btn, const QString &png, int icon)
{
int size = 16;
int width = 18;
int height = 18;
QPixmap pix;
if (QPixmap(png).isNull()) {
pix = IconHelper::Instance()->getPixmap(QUIConfig::TextColor, str, size, width, height);
pix = IconHelper::Instance()->getPixmap(QUIConfig::TextColor, icon, size, width, height);
} else {
pix = QPixmap(png);
}
@@ -138,22 +258,6 @@ void QUIHelper::setIconBtn(QAbstractButton *btn, const QString &png, const QChar
btn->setIcon(QIcon(pix));
}
void QUIHelper::newDir(const QString &dirName)
{
QString strDir = dirName;
//如果路径中包含斜杠字符则说明是绝对路径
//linux系统路径字符带有 / windows系统 路径字符带有 :/
if (!strDir.startsWith("/") && !strDir.contains(":/")) {
strDir = QString("%1/%2").arg(QUIHelper::appPath()).arg(strDir);
}
QDir dir(strDir);
if (!dir.exists()) {
dir.mkpath(strDir);
}
}
void QUIHelper::writeInfo(const QString &info, bool needWrite, const QString &filePath)
{
if (!needWrite) {
@@ -231,80 +335,6 @@ void QUIHelper::setFramelessForm(QWidget *widgetMain, QWidget *widgetTitle,
IconHelper::Instance()->setIcon(btnClose, QUIConfig::IconClose, QUIConfig::FontSize);
}
void QUIHelper::setFormInCenter(QWidget *frm)
{
//增加了多屏幕的判断在哪个屏幕就显示在哪个屏幕
int screenIndex = QUIHelper::getScreenIndex();
int frmX = frm->width();
int frmY = frm->height();
QDesktopWidget w;
QRect rect = w.availableGeometry(screenIndex);
int deskWidth = rect.width();
int deskHeight = rect.height();
QPoint movePoint(deskWidth / 2 - frmX / 2 + rect.x(), deskHeight / 2 - frmY / 2);
frm->move(movePoint);
}
void QUIHelper::setTranslator(const QString &qmFile)
{
QTranslator *translator = new QTranslator(qApp);
translator->load(qmFile);
qApp->installTranslator(translator);
}
void QUIHelper::setCode()
{
#if (QT_VERSION <= QT_VERSION_CHECK(5,0,0))
#if _MSC_VER
QTextCodec *codec = QTextCodec::codecForName("gbk");
#else
QTextCodec *codec = QTextCodec::codecForName("utf-8");
#endif
QTextCodec::setCodecForLocale(codec);
QTextCodec::setCodecForCStrings(codec);
QTextCodec::setCodecForTr(codec);
#else
QTextCodec *codec = QTextCodec::codecForName("utf-8");
QTextCodec::setCodecForLocale(codec);
#endif
}
void QUIHelper::setFont(const QString &ttfFile, const QString &fontName, int fontSize)
{
QFont font;
font.setFamily(fontName);
font.setPixelSize(fontSize);
//如果存在字体文件则设备字体文件中的字体
//安卓版本和网页版本需要字体文件一起打包单独设置字体
if (!ttfFile.isEmpty()) {
QFontDatabase fontDb;
int fontId = fontDb.addApplicationFont(ttfFile);
if (fontId != -1) {
QStringList androidFont = fontDb.applicationFontFamilies(fontId);
if (androidFont.size() != 0) {
font.setFamily(androidFont.at(0));
font.setPixelSize(fontSize);
}
}
}
qApp->setFont(font);
}
void QUIHelper::sleep(int msec)
{
if (msec > 0) {
#if (QT_VERSION < QT_VERSION_CHECK(5,7,0))
QTime endTime = QTime::currentTime().addMSecs(msec);
while (QTime::currentTime() < endTime) {
QCoreApplication::processEvents(QEventLoop::AllEvents, 100);
}
#else
QThread::msleep(msec);
#endif
}
}
void QUIHelper::setSystemDateTime(const QString &year, const QString &month, const QString &day, const QString &hour, const QString &min, const QString &sec)
{
#ifdef Q_OS_WIN
@@ -340,8 +370,10 @@ QString QUIHelper::getIP(const QString &url)
{
//取出IP地址
QRegExp regExp("((?:(?:25[0-5]|2[0-4]\\d|[01]?\\d?\\d)\\.){3}(?:25[0-5]|2[0-4]\\d|[01]?\\d?\\d))");
regExp.indexIn(url);
return url.mid(url.indexOf(regExp), regExp.matchedLength());
int start = regExp.indexIn(url);
int length = regExp.matchedLength();
QString ip = url.mid(start, length);
return ip;
}
bool QUIHelper::isIP(const QString &ip)
@@ -1180,7 +1212,7 @@ void QUIHelper::initTableView(QTableView *tableView, int rowHeight, bool headVis
tableView->setSelectionMode(QAbstractItemView::SingleSelection);
//表头不可单击
#if (QT_VERSION > QT_VERSION_CHECK(5,0,0))
#if (QT_VERSION >= QT_VERSION_CHECK(5,0,0))
tableView->horizontalHeader()->setSectionsClickable(false);
#else
tableView->horizontalHeader()->setClickable(false);

View File

@@ -6,21 +6,32 @@
class QUIHelper
{
public:
//获取uuid
static QString getUuid();
//获取当前鼠标所在屏幕
//获取当前鼠标所在屏幕索引+尺寸
static int getScreenIndex();
static QRect getScreenRect(bool available = true);
//桌面宽度高度
//获取桌面宽度高度+居中显示
static int deskWidth();
static int deskHeight();
static void setFormInCenter(QWidget *form);
//程序文件名称+当前所在路径
static QString appName();
static QString appPath();
//初始化随机数种子
//获取uuid+初始化随机数种子+新建目录+延时
static QString getUuid();
static void initRand();
static void newDir(const QString &dirName);
static void sleep(int msec);
//设置编码
static void setCode(bool utf8 = true);
//设置字体
static void setFont(const QString &ttfFile = ":/image/DroidSansFallback.ttf",
const QString &fontName = "Microsoft Yahei", int fontSize = 12);
//设置翻译文件
static void setTranslator(const QString &qmFile = ":/image/qt_zh_CN.qm");
//初始化数据库
static void initDb(const QString &dbName);
@@ -31,10 +42,7 @@ public:
static bool checkIniFile(const QString &iniFile);
//设置图标到按钮
static void setIconBtn(QAbstractButton *btn, const QString &png, const QChar &str);
//新建目录
static void newDir(const QString &dirName);
static void setIconBtn(QAbstractButton *btn, const QString &png, int icon);
//写入消息到额外的的消息日志文件
static void writeInfo(const QString &info, bool needWrite = false, const QString &filePath = "log");
@@ -47,18 +55,6 @@ public:
QLabel *labIco, QPushButton *btnClose,
bool tool = true, bool top = true, bool menu = false);
//设置窗体居中显示
static void setFormInCenter(QWidget *frm);
//设置翻译文件
static void setTranslator(const QString &qmFile = ":/image/qt_zh_CN.qm");
//设置编码
static void setCode();
//设置字体
static void setFont(const QString &ttfFile = ":/image/DroidSansFallback.ttf",
const QString &fontName = "Microsoft Yahei", int fontSize = 12);
//设置延时
static void sleep(int msec);
//设置系统时间
static void setSystemDateTime(const QString &year, const QString &month, const QString &day,
const QString &hour, const QString &min, const QString &sec);

View File

@@ -285,7 +285,7 @@ void QUIInputBox::on_btnMenu_Close_clicked()
close();
}
void QUIInputBox::setIconMain(const QChar &icon, quint32 size)
void QUIInputBox::setIconMain(int icon, quint32 size)
{
IconHelper::Instance()->setIcon(this->labIco, icon, size);
}

View File

@@ -59,7 +59,7 @@ public:
QString getValue()const;
public Q_SLOTS:
void setIconMain(const QChar &icon, quint32 size = 12);
void setIconMain(int icon, quint32 size = 12);
void setParameter(const QString &title, int type = 0, int closeSec = 0,
QString placeholderText = QString(), bool pwd = false,
const QString &defaultValue = QString());

View File

@@ -262,17 +262,17 @@ void QUIMessageBox::on_btnMenu_Close_clicked()
close();
}
void QUIMessageBox::setIconMain(const QChar &icon, quint32 size)
void QUIMessageBox::setIconMain(int icon, quint32 size)
{
IconHelper::Instance()->setIcon(this->labIco, icon, size);
}
void QUIMessageBox::setIconMsg(const QString &png, const QChar &str)
void QUIMessageBox::setIconMsg(const QString &png, int icon)
{
//图片存在则取图片,不存在则取图形字体
int size = this->labIcoMain->size().height();
if (QImage(png).isNull()) {
IconHelper::Instance()->setIcon(this->labIcoMain, str, size);
IconHelper::Instance()->setIcon(this->labIcoMain, icon, size);
} else {
this->labIcoMain->setStyleSheet(QString("border-image:url(%1);").arg(png));
}

View File

@@ -56,8 +56,8 @@ private slots:
void on_btnMenu_Close_clicked();
public Q_SLOTS:
void setIconMain(const QChar &icon, quint32 size = 12);
void setIconMsg(const QString &png, const QChar &str);
void setIconMain(int icon, quint32 size = 12);
void setIconMsg(const QString &png, int icon);
void setMessage(const QString &msg, int type, int closeSec = 0);
};

View File

@@ -198,7 +198,7 @@ void QUITipBox::on_btnMenu_Close_clicked()
close();
}
void QUITipBox::setIconMain(const QChar &icon, quint32 size)
void QUITipBox::setIconMain(int icon, quint32 size)
{
IconHelper::Instance()->setIcon(this->labIco, icon, size);
}
@@ -216,8 +216,7 @@ void QUITipBox::setTip(const QString &title, const QString &tip, bool fullScreen
this->labInfo->setAlignment(center ? Qt::AlignCenter : Qt::AlignLeft);
this->setWindowTitle(this->labTitle->text());
int screenIndex = QUIHelper::getScreenIndex();
QRect rect = fullScreen ? qApp->desktop()->screenGeometry(screenIndex) : qApp->desktop()->availableGeometry(screenIndex);
QRect rect = QUIHelper::getScreenRect(!fullScreen);
int width = rect.width();
int height = rect.height();
int x = width - this->width() + rect.x();
@@ -235,8 +234,7 @@ void QUITipBox::setTip(const QString &title, const QString &tip, bool fullScreen
void QUITipBox::hide()
{
int screenIndex = QUIHelper::getScreenIndex();
QRect rect = fullScreen ? qApp->desktop()->screenGeometry(screenIndex) : qApp->desktop()->availableGeometry(screenIndex);
QRect rect = QUIHelper::getScreenRect(!fullScreen);
int width = rect.width();
int height = rect.height();
int x = width - this->width() + rect.x();
@@ -245,7 +243,7 @@ void QUITipBox::hide()
//启动动画
animation->stop();
animation->setStartValue(QPoint(x, y));
animation->setEndValue(QPoint(x, qApp->desktop()->geometry().height()));
animation->setEndValue(QPoint(x, QUIHelper::getScreenRect(false).height()));
animation->start();
}

View File

@@ -49,7 +49,7 @@ private slots:
void on_btnMenu_Close_clicked();
public Q_SLOTS:
void setIconMain(const QChar &icon, quint32 size = 12);
void setIconMain(int icon, quint32 size = 12);
void setTip(const QString &title, const QString &tip, bool fullScreen = false, bool center = true, int closeSec = 0);
void hide();
};

View File

@@ -271,7 +271,7 @@ void QUIWidget::changeStyle()
emit changeStyle(qssFile);
}
void QUIWidget::setIcon(QUIWidget::Widget widget, const QChar &icon, quint32 size)
void QUIWidget::setIcon(QUIWidget::Widget widget, int icon, quint32 size)
{
if (widget == QUIWidget::Lab_Ico) {
setIconMain(icon, size);
@@ -293,7 +293,7 @@ void QUIWidget::setIcon(QUIWidget::Widget widget, const QChar &icon, quint32 siz
}
}
void QUIWidget::setIconMain(const QChar &icon, quint32 size)
void QUIWidget::setIconMain(int icon, quint32 size)
{
QUIConfig::IconMain = icon;
IconHelper::Instance()->setIcon(this->labIco, icon, size);
@@ -418,8 +418,7 @@ void QUIWidget::on_btnMenu_Max_clicked()
setIcon(QUIWidget::BtnMenu_Normal, QUIConfig::IconNormal);
} else {
location = this->geometry();
int screenIndex = QUIHelper::getScreenIndex();
this->setGeometry(qApp->desktop()->availableGeometry(screenIndex));
this->setGeometry(QUIHelper::getScreenRect());
setIcon(QUIWidget::BtnMenu_Max, QUIConfig::IconMax);
}

View File

@@ -77,8 +77,8 @@ private slots:
public Q_SLOTS:
//设置部件图标
void setIcon(QUIWidget::Widget widget, const QChar &icon, quint32 size = 12);
void setIconMain(const QChar &icon, quint32 size = 12);
void setIcon(QUIWidget::Widget widget, int icon, quint32 size = 12);
void setIconMain(int icon, quint32 size = 12);
//设置部件图片
void setPixmap(QUIWidget::Widget widget, const QString &file, const QSize &size = QSize(16, 16));
//设置部件是否可见

View File

@@ -7,6 +7,7 @@
QT += core gui
greaterThan(QT_MAJOR_VERSION, 4): QT += widgets
greaterThan(QT_MAJOR_VERSION, 5): QT += core5compat
TARGET = countcode
TEMPLATE = app

View File

@@ -39,7 +39,7 @@ QVariant SqlQueryModel::data(const QModelIndex &index, int role) const
if (row == index.row()) {
if (role == Qt::BackgroundRole) {
value = QColor(property("hoverBgColor").toString());
} else if (role == Qt::TextColorRole) {
} else if (role == Qt::ForegroundRole) {
value = QColor(property("hoverTextColor").toString());
}
}

View File

@@ -7,6 +7,7 @@
QT += core gui sql
greaterThan(QT_MAJOR_VERSION, 4): QT += widgets
greaterThan(QT_MAJOR_VERSION, 5): QT += core5compat
TARGET = dbpage
TEMPLATE = app

View File

@@ -7,6 +7,7 @@
QT += core gui
greaterThan(QT_MAJOR_VERSION, 4): QT += widgets
greaterThan(QT_MAJOR_VERSION, 5): QT += core5compat
TARGET = devicebutton
TEMPLATE = app

View File

@@ -21,6 +21,7 @@ class DeviceSizeTable : public QTableWidget
{
Q_OBJECT
Q_PROPERTY(QColor bgColor READ getBgColor WRITE setBgColor)
Q_PROPERTY(QColor chunkColor1 READ getChunkColor1 WRITE setChunkColor1)
Q_PROPERTY(QColor chunkColor2 READ getChunkColor2 WRITE setChunkColor2)

View File

@@ -7,6 +7,7 @@
QT += core gui
greaterThan(QT_MAJOR_VERSION, 4): QT += widgets
greaterThan(QT_MAJOR_VERSION, 5): QT += core5compat
TARGET = devicesizetable
TEMPLATE = app

View File

@@ -4,9 +4,10 @@
#
#-------------------------------------------------
QT += core gui network sql xml
QT += core gui network
greaterThan(QT_MAJOR_VERSION, 4): QT += widgets
greaterThan(QT_MAJOR_VERSION, 5): QT += core5compat
TARGET = emailtool
TEMPLATE = app
@@ -14,10 +15,10 @@ DESTDIR = $$PWD/../bin
CONFIG += warn_off
SOURCES += main.cpp
SOURCES += frmemailtool.cpp
HEADERS += frmemailtool.h
SOURCES += frmemailtool.cpp sendemailthread.cpp
HEADERS += frmemailtool.h sendemailthread.h
FORMS += frmemailtool.ui
include ($$PWD/sendemail/sendemail.pri)
INCLUDEPATH += $$PWD
INCLUDEPATH += $$PWD/sendemail
INCLUDEPATH += $$PWD/../3rd_smtpclient
include ($$PWD/../3rd_smtpclient/3rd_smtpclient.pri)

View File

@@ -13,174 +13,180 @@
<property name="windowTitle">
<string>Form</string>
</property>
<layout class="QGridLayout" name="gridLayout">
<property name="leftMargin">
<number>6</number>
</property>
<property name="topMargin">
<number>6</number>
</property>
<property name="rightMargin">
<number>6</number>
</property>
<property name="bottomMargin">
<number>6</number>
</property>
<item row="0" column="0">
<widget class="QLabel" name="labSenderAddr">
<property name="text">
<string>用户名:</string>
</property>
</widget>
</item>
<item row="0" column="1">
<widget class="QLineEdit" name="txtSenderAddr">
<property name="text">
<string>feiyangqingyun@126.com</string>
</property>
</widget>
</item>
<item row="0" column="2">
<widget class="QLabel" name="labSenderPwd">
<property name="text">
<string>密码:</string>
</property>
</widget>
</item>
<item row="0" column="3">
<widget class="QLineEdit" name="txtSenderPwd">
<property name="text">
<string/>
</property>
<property name="echoMode">
<enum>QLineEdit::Password</enum>
</property>
</widget>
</item>
<item row="0" column="4">
<widget class="QLabel" name="labServer">
<property name="text">
<string>服务器:</string>
</property>
</widget>
</item>
<item row="0" column="5">
<widget class="QComboBox" name="cboxServer">
<item>
<property name="text">
<string>smtp.163.com</string>
</property>
<layout class="QVBoxLayout" name="verticalLayout">
<item>
<layout class="QGridLayout" name="gridLayout">
<item row="2" column="4">
<widget class="QPushButton" name="btnSend">
<property name="cursor">
<cursorShape>PointingHandCursor</cursorShape>
</property>
<property name="text">
<string>发送</string>
</property>
</widget>
</item>
<item>
<property name="text">
<string>smtp.126.com</string>
</property>
<item row="1" column="3">
<widget class="QComboBox" name="cboxPort">
<item>
<property name="text">
<string>25</string>
</property>
</item>
<item>
<property name="text">
<string>465</string>
</property>
</item>
<item>
<property name="text">
<string>587</string>
</property>
</item>
</widget>
</item>
<item>
<property name="text">
<string>smtp.qq.com</string>
</property>
<item row="1" column="4">
<widget class="QCheckBox" name="ckSSL">
<property name="text">
<string>SSL</string>
</property>
</widget>
</item>
<item>
<property name="text">
<string>smt.sina.com</string>
</property>
<item row="1" column="2">
<widget class="QLabel" name="labPort">
<property name="text">
<string>服务端口</string>
</property>
</widget>
</item>
<item>
<property name="text">
<string>smtp.sohu.com</string>
</property>
<item row="3" column="4">
<widget class="QPushButton" name="btnSelect">
<property name="cursor">
<cursorShape>PointingHandCursor</cursorShape>
</property>
<property name="text">
<string>浏览</string>
</property>
</widget>
</item>
<item>
<property name="text">
<string>smtp.139.com</string>
</property>
<item row="2" column="3">
<widget class="QLineEdit" name="txtReceiverAddr">
<property name="text">
<string>feiyangqingyun@163.com;517216493@qq.com</string>
</property>
</widget>
</item>
<item>
<property name="text">
<string>smtp.189.com</string>
</property>
<item row="3" column="1" colspan="3">
<widget class="QLineEdit" name="txtFileName"/>
</item>
</widget>
</item>
<item row="0" column="6">
<widget class="QLabel" name="labPort">
<property name="text">
<string>端口:</string>
</property>
</widget>
</item>
<item row="0" column="7">
<widget class="QComboBox" name="cboxPort">
<item>
<property name="text">
<string>25</string>
</property>
<item row="2" column="0">
<widget class="QLabel" name="labTitle">
<property name="text">
<string>邮件标题</string>
</property>
</widget>
</item>
<item>
<property name="text">
<string>465</string>
</property>
<item row="2" column="1">
<widget class="QLineEdit" name="txtTitle">
<property name="text">
<string>测试邮件</string>
</property>
</widget>
</item>
<item>
<property name="text">
<string>587</string>
</property>
<item row="1" column="1">
<widget class="QComboBox" name="cboxServer">
<item>
<property name="text">
<string>smtp.163.com</string>
</property>
</item>
<item>
<property name="text">
<string>smtp.126.com</string>
</property>
</item>
<item>
<property name="text">
<string>smtp.qq.com</string>
</property>
</item>
<item>
<property name="text">
<string>smt.sina.com</string>
</property>
</item>
<item>
<property name="text">
<string>smtp.sohu.com</string>
</property>
</item>
<item>
<property name="text">
<string>smtp.139.com</string>
</property>
</item>
<item>
<property name="text">
<string>smtp.189.com</string>
</property>
</item>
</widget>
</item>
</widget>
<item row="2" column="2">
<widget class="QLabel" name="labReceiverAddr">
<property name="text">
<string>收件地址</string>
</property>
</widget>
</item>
<item row="3" column="0">
<widget class="QLabel" name="labFileName">
<property name="text">
<string>选择附件</string>
</property>
</widget>
</item>
<item row="1" column="0">
<widget class="QLabel" name="labServer">
<property name="text">
<string>服务地址</string>
</property>
</widget>
</item>
<item row="0" column="0">
<widget class="QLabel" name="labSenderAddr">
<property name="text">
<string>用户名称</string>
</property>
</widget>
</item>
<item row="0" column="1">
<widget class="QLineEdit" name="txtSenderAddr">
<property name="text">
<string>feiyangqingyun@126.com</string>
</property>
</widget>
</item>
<item row="0" column="2">
<widget class="QLabel" name="labSenderPwd">
<property name="text">
<string>用户密码</string>
</property>
</widget>
</item>
<item row="0" column="3">
<widget class="QLineEdit" name="txtSenderPwd">
<property name="text">
<string/>
</property>
<property name="echoMode">
<enum>QLineEdit::Password</enum>
</property>
</widget>
</item>
</layout>
</item>
<item row="0" column="8">
<widget class="QCheckBox" name="ckSSL">
<property name="text">
<string>SSL</string>
</property>
</widget>
</item>
<item row="0" column="9">
<widget class="QPushButton" name="btnSend">
<property name="cursor">
<cursorShape>PointingHandCursor</cursorShape>
</property>
<property name="text">
<string>发送</string>
</property>
</widget>
</item>
<item row="1" column="0">
<widget class="QLabel" name="labTitle">
<property name="text">
<string>标 题:</string>
</property>
</widget>
</item>
<item row="4" column="0">
<widget class="QLabel" name="labFileName">
<property name="text">
<string>附 件:</string>
</property>
</widget>
</item>
<item row="5" column="0">
<widget class="QLabel" name="labContent">
<property name="text">
<string>正 文:</string>
</property>
</widget>
</item>
<item row="4" column="9">
<widget class="QPushButton" name="btnSelect">
<property name="cursor">
<cursorShape>PointingHandCursor</cursorShape>
</property>
<property name="text">
<string>浏览</string>
</property>
</widget>
</item>
<item row="4" column="1" colspan="8">
<widget class="QLineEdit" name="txtFileName"/>
</item>
<item row="5" column="1" colspan="9">
<item>
<widget class="QTextBrowser" name="txtContent">
<property name="readOnly">
<bool>false</bool>
@@ -189,35 +195,27 @@
<string>&lt;!DOCTYPE HTML PUBLIC &quot;-//W3C//DTD HTML 4.0//EN&quot; &quot;http://www.w3.org/TR/REC-html40/strict.dtd&quot;&gt;
&lt;html&gt;&lt;head&gt;&lt;meta name=&quot;qrichtext&quot; content=&quot;1&quot; /&gt;&lt;style type=&quot;text/css&quot;&gt;
p, li { white-space: pre-wrap; }
&lt;/style&gt;&lt;/head&gt;&lt;body style=&quot; font-family:'宋体'; font-size:9pt; font-weight:400; font-style:normal;&quot;&gt;
&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-size:11pt;&quot;&gt;1&lt;/span&gt;&lt;span style=&quot; font-family:'Times New Roman'; font-size:11pt;&quot;&gt;、最短的爱情哲理小说:“&lt;/span&gt;&lt;span style=&quot; font-size:11pt;&quot;&gt;你应该嫁给我啦?&lt;/span&gt;&lt;span style=&quot; font-family:'Times New Roman'; font-size:11pt;&quot;&gt;” “ &lt;/span&gt;&lt;span style=&quot; font-size:11pt;&quot;&gt;不&lt;/span&gt;&lt;span style=&quot; font-family:'Times New Roman'; font-size:11pt;&quot;&gt;” &lt;/span&gt;&lt;span style=&quot; font-size:11pt;&quot;&gt;于是他俩又继续幸福地生活在一起&lt;/span&gt;&lt;span style=&quot; font-family:'Times New Roman'; font-size:11pt;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot; font-size:11pt;&quot;&gt;2&lt;/span&gt;&lt;span style=&quot; font-family:'Times New Roman'; font-size:11pt;&quot;&gt;、近年来中国最精彩的写实小说,全文八个字:&lt;/span&gt;&lt;span style=&quot; font-family:'Times New Roman'; font-size:16pt; font-weight:600; font-style:italic; color:#ff007f;&quot;&gt;此地钱多人傻速来&lt;/span&gt;&lt;span style=&quot; font-family:'Times New Roman'; font-size:11pt;&quot;&gt;  据说是发自杭州市宝石山下一出租房的汇款单上的简短附言,是该按摩女给家乡妹妹汇 款时随手涂鸦的,令无数专业作家汗颜!&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot; font-size:11pt;&quot;&gt;3&lt;/span&gt;&lt;span style=&quot; font-family:'Times New Roman'; font-size:11pt;&quot;&gt;、最短的幽默小说 《夜》 男:疼么?女:恩!男:算了?女:别!&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-size:11pt;&quot;&gt;4&lt;/span&gt;&lt;span style=&quot; font-family:'Times New Roman'; font-size:11pt;&quot;&gt;、最短的荒诞小说:有一个面包走在街上,它觉得自己很饿,就把自己吃了。&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot; font-size:11pt;&quot;&gt;5&lt;/span&gt;&lt;span style=&quot; font-family:'Times New Roman'; font-size:11pt;&quot;&gt;、世界最短言情小说:他死的那天,孩子出生了。&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot; font-size:11pt;&quot;&gt;6&lt;/span&gt;&lt;span style=&quot; font-family:'Times New Roman'; font-size:11pt;&quot;&gt;、世界最短武侠小说:&lt;/span&gt;&lt;span style=&quot; font-family:'Times New Roman'; font-size:11pt; font-weight:600; color:#00aa00;&quot;&gt;高手被豆腐砸死了&lt;/span&gt;&lt;span style=&quot; font-family:'Times New Roman'; font-size:11pt;&quot;&gt;。&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot; font-size:11pt;&quot;&gt;7&lt;/span&gt;&lt;span style=&quot; font-family:'Times New Roman'; font-size:11pt;&quot;&gt;、世界最短科幻小说:最后一个地球人坐在家里,突然响起了敲门声。&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot; font-size:11pt;&quot;&gt;8&lt;/span&gt;&lt;span style=&quot; font-family:'Times New Roman'; font-size:11pt;&quot;&gt;、世界最短悬疑小说:生,死,生。&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot; font-size:11pt;&quot;&gt;9&lt;/span&gt;&lt;span style=&quot; font-family:'Times New Roman'; font-size:11pt;&quot;&gt;、世界最短推理小说:他死了,一定曾经活过。 &lt;br /&gt;1&lt;/span&gt;&lt;span style=&quot; font-size:11pt;&quot;&gt;0&lt;/span&gt;&lt;span style=&quot; font-family:'Times New Roman'; font-size:11pt;&quot;&gt;、世界最短恐怖小说:惊醒,身边躺着自己的尸体。&lt;/span&gt;&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
</property>
</widget>
</item>
<item row="1" column="1" colspan="3">
<widget class="QLineEdit" name="txtTitle">
<property name="text">
<string>测试邮件</string>
</property>
</widget>
</item>
<item row="1" column="4">
<widget class="QLabel" name="labReceiverAddr">
<property name="text">
<string>收件人:</string>
</property>
</widget>
</item>
<item row="1" column="5" colspan="5">
<widget class="QLineEdit" name="txtReceiverAddr">
<property name="text">
<string>feiyangqingyun@163.com;517216493@qq.com</string>
&lt;/style&gt;&lt;/head&gt;&lt;body style=&quot; font-family:'SimSun'; font-size:9.07563pt; font-weight:400; font-style:normal;&quot;&gt;
&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-family:'宋体'; font-size:11pt;&quot;&gt;1&lt;/span&gt;&lt;span style=&quot; font-family:'Times New Roman'; font-size:11pt;&quot;&gt;、最短的爱情哲理小说:“&lt;/span&gt;&lt;span style=&quot; font-family:'宋体'; font-size:11pt;&quot;&gt;你应该嫁给我啦?&lt;/span&gt;&lt;span style=&quot; font-family:'Times New Roman'; font-size:11pt;&quot;&gt;” “ &lt;/span&gt;&lt;span style=&quot; font-family:'宋体'; font-size:11pt;&quot;&gt;不&lt;/span&gt;&lt;span style=&quot; font-family:'Times New Roman'; font-size:11pt;&quot;&gt;” &lt;/span&gt;&lt;span style=&quot; font-family:'宋体'; font-size:11pt;&quot;&gt;于是他俩又继续幸福地生活在一起&lt;/span&gt;&lt;span style=&quot; font-family:'Times New Roman'; font-size:11pt;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot; font-family:'宋体'; font-size:11pt;&quot;&gt;2&lt;/span&gt;&lt;span style=&quot; font-family:'Times New Roman'; font-size:11pt;&quot;&gt;、近年来中国最精彩的写实小说,全文八个字:&lt;/span&gt;&lt;span style=&quot; font-family:'Times New Roman'; font-size:16pt; font-weight:600; font-style:italic; color:#ff007f;&quot;&gt;此地钱多人傻速来&lt;/span&gt;&lt;span style=&quot; font-family:'Times New Roman'; font-size:11pt;&quot;&gt;  据说是发自杭州市宝石山下一出租房的汇款单上的简短附言,是该按摩女给家乡妹妹汇 款时随手涂鸦的,令无数专业作家汗颜!&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot; font-family:'宋体'; font-size:11pt;&quot;&gt;3&lt;/span&gt;&lt;span style=&quot; font-family:'Times New Roman'; font-size:11pt;&quot;&gt;、最短的幽默小说 《夜》 男:疼么?女:恩!男:算了?女:别!&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-family:'宋体'; font-size:11pt;&quot;&gt;4&lt;/span&gt;&lt;span style=&quot; font-family:'Times New Roman'; font-size:11pt;&quot;&gt;、最短的荒诞小说:有一个面包走在街上,它觉得自己很饿,就把自己吃了。&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot; font-family:'宋体'; font-size:11pt;&quot;&gt;5&lt;/span&gt;&lt;span style=&quot; font-family:'Times New Roman'; font-size:11pt;&quot;&gt;、世界最短言情小说:他死的那天,孩子出生了。&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot; font-family:'宋体'; font-size:11pt;&quot;&gt;6&lt;/span&gt;&lt;span style=&quot; font-family:'Times New Roman'; font-size:11pt;&quot;&gt;、世界最短武侠小说:&lt;/span&gt;&lt;span style=&quot; font-family:'Times New Roman'; font-size:11pt; font-weight:600; color:#00aa00;&quot;&gt;高手被豆腐砸死了&lt;/span&gt;&lt;span style=&quot; font-family:'Times New Roman'; font-size:11pt;&quot;&gt;。&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot; font-family:'宋体'; font-size:11pt;&quot;&gt;7&lt;/span&gt;&lt;span style=&quot; font-family:'Times New Roman'; font-size:11pt;&quot;&gt;、世界最短科幻小说:最后一个地球人坐在家里,突然响起了敲门声。&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot; font-family:'宋体'; font-size:11pt;&quot;&gt;8&lt;/span&gt;&lt;span style=&quot; font-family:'Times New Roman'; font-size:11pt;&quot;&gt;、世界最短悬疑小说:生,死,生。&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot; font-family:'宋体'; font-size:11pt;&quot;&gt;9&lt;/span&gt;&lt;span style=&quot; font-family:'Times New Roman'; font-size:11pt;&quot;&gt;、世界最短推理小说:他死了,一定曾经活过。 &lt;br /&gt;1&lt;/span&gt;&lt;span style=&quot; font-family:'宋体'; font-size:11pt;&quot;&gt;0&lt;/span&gt;&lt;span style=&quot; font-family:'Times New Roman'; font-size:11pt;&quot;&gt;、世界最短恐怖小说:惊醒,身边躺着自己的尸体。&lt;/span&gt;&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
</property>
</widget>
</item>
</layout>
</widget>
<tabstops>
<tabstop>txtSenderAddr</tabstop>
<tabstop>txtSenderPwd</tabstop>
<tabstop>cboxServer</tabstop>
<tabstop>cboxPort</tabstop>
<tabstop>ckSSL</tabstop>
<tabstop>txtTitle</tabstop>
<tabstop>txtReceiverAddr</tabstop>
<tabstop>btnSend</tabstop>
<tabstop>txtFileName</tabstop>
<tabstop>btnSelect</tabstop>
<tabstop>txtContent</tabstop>
</tabstops>
<resources/>
<connections/>
</ui>

View File

@@ -24,7 +24,7 @@ int main(int argc, char *argv[])
#endif
frmEmailTool w;
w.setWindowTitle("邮件发送工具");
w.setWindowTitle("串口调试助手 V2021 (QQ: 517216493 WX: feiyangqingyun)");
w.show();
return a.exec();

View File

@@ -1,222 +0,0 @@
#include "mimemessage.h"
#include <QDateTime>
#include "quotedprintable.h"
#include <typeinfo>
MimeMessage::MimeMessage(bool createAutoMimeContent) :
hEncoding(MimePart::_8Bit)
{
if (createAutoMimeContent) {
this->content = new MimeMultiPart();
}
}
MimeMessage::~MimeMessage()
{
}
MimePart &MimeMessage::getContent()
{
return *content;
}
void MimeMessage::setContent(MimePart *content)
{
this->content = content;
}
void MimeMessage::setSender(EmailAddress *e)
{
this->sender = e;
}
void MimeMessage::addRecipient(EmailAddress *rcpt, RecipientType type)
{
switch (type) {
case To:
recipientsTo << rcpt;
break;
case Cc:
recipientsCc << rcpt;
break;
case Bcc:
recipientsBcc << rcpt;
break;
}
}
void MimeMessage::addTo(EmailAddress *rcpt)
{
this->recipientsTo << rcpt;
}
void MimeMessage::addCc(EmailAddress *rcpt)
{
this->recipientsCc << rcpt;
}
void MimeMessage::addBcc(EmailAddress *rcpt)
{
this->recipientsBcc << rcpt;
}
void MimeMessage::setSubject(const QString &subject)
{
this->subject = subject;
}
void MimeMessage::addPart(MimePart *part)
{
if (typeid(*content) == typeid(MimeMultiPart)) {
((MimeMultiPart *) content)->addPart(part);
};
}
void MimeMessage::setHeaderEncoding(MimePart::Encoding hEnc)
{
this->hEncoding = hEnc;
}
const EmailAddress &MimeMessage::getSender() const
{
return *sender;
}
const QList<EmailAddress *> &MimeMessage::getRecipients(RecipientType type) const
{
switch (type) {
default:
case To:
return recipientsTo;
case Cc:
return recipientsCc;
case Bcc:
return recipientsBcc;
}
}
const QString &MimeMessage::getSubject() const
{
return subject;
}
const QList<MimePart *> &MimeMessage::getParts() const
{
if (typeid(*content) == typeid(MimeMultiPart)) {
return ((MimeMultiPart *) content)->getParts();
} else {
QList<MimePart *> *res = new QList<MimePart *>();
res->append(content);
return *res;
}
}
QString MimeMessage::toString()
{
QString mime;
mime = "From:";
if (sender->getName() != "") {
switch (hEncoding) {
case MimePart::Base64:
mime += " =?utf-8?B?" + QByteArray().append(sender->getName()).toBase64() + "?=";
break;
case MimePart::QuotedPrintable:
mime += " =?utf-8?Q?" + QuotedPrintable::encode(QByteArray().append(sender->getName())).replace(' ', "_").replace(':', "=3A") + "?=";
break;
default:
mime += " " + sender->getName();
}
}
mime += " <" + sender->getAddress() + ">\r\n";
mime += "To:";
QList<EmailAddress *>::iterator it;
int i;
for (i = 0, it = recipientsTo.begin(); it != recipientsTo.end(); ++it, ++i) {
if (i != 0) {
mime += ",";
}
if ((*it)->getName() != "") {
switch (hEncoding) {
case MimePart::Base64:
mime += " =?utf-8?B?" + QByteArray().append((*it)->getName()).toBase64() + "?=";
break;
case MimePart::QuotedPrintable:
mime += " =?utf-8?Q?" + QuotedPrintable::encode(QByteArray().append((*it)->getName())).replace(' ', "_").replace(':', "=3A") + "?=";
break;
default:
mime += " " + (*it)->getName();
}
}
mime += " <" + (*it)->getAddress() + ">";
}
mime += "\r\n";
if (recipientsCc.size() != 0) {
mime += "Cc:";
}
for (i = 0, it = recipientsCc.begin(); it != recipientsCc.end(); ++it, ++i) {
if (i != 0) {
mime += ",";
}
if ((*it)->getName() != "") {
switch (hEncoding) {
case MimePart::Base64:
mime += " =?utf-8?B?" + QByteArray().append((*it)->getName()).toBase64() + "?=";
break;
case MimePart::QuotedPrintable:
mime += " =?utf-8?Q?" + QuotedPrintable::encode(QByteArray().append((*it)->getName())).replace(' ', "_").replace(':', "=3A") + "?=";
break;
default:
mime += " " + (*it)->getName();
}
}
mime += " <" + (*it)->getAddress() + ">";
}
if (recipientsCc.size() != 0) {
mime += "\r\n";
}
mime += "Subject: ";
switch (hEncoding) {
case MimePart::Base64:
mime += "=?utf-8?B?" + QByteArray().append(subject).toBase64() + "?=";
break;
case MimePart::QuotedPrintable:
mime += "=?utf-8?Q?" + QuotedPrintable::encode(QByteArray().append(subject)).replace(' ', "_").replace(':', "=3A") + "?=";
break;
default:
mime += subject;
}
mime += "\r\n";
mime += "MIME-Version: 1.0\r\n";
mime += content->toString();
return mime;
}

View File

@@ -1,67 +0,0 @@
#include "mimemultipart.h"
#include <QTime>
#include <QCryptographicHash>
const QString MULTI_PART_NAMES[] = {
"multipart/mixed", // Mixed
"multipart/digest", // Digest
"multipart/alternative", // Alternative
"multipart/related", // Related
"multipart/report", // Report
"multipart/signed", // Signed
"multipart/encrypted" // Encrypted
};
MimeMultiPart::MimeMultiPart(MultiPartType type)
{
this->type = type;
this->cType = MULTI_PART_NAMES[this->type];
this->cEncoding = _8Bit;
QCryptographicHash md5(QCryptographicHash::Md5);
md5.addData(QByteArray().append(qrand()));
cBoundary = md5.result().toHex();
}
MimeMultiPart::~MimeMultiPart()
{
}
void MimeMultiPart::addPart(MimePart *part)
{
parts.append(part);
}
const QList<MimePart *> &MimeMultiPart::getParts() const
{
return parts;
}
void MimeMultiPart::prepare()
{
QList<MimePart *>::iterator it;
content = "";
for (it = parts.begin(); it != parts.end(); it++) {
content += "--" + cBoundary + "\r\n";
(*it)->prepare();
content += (*it)->toString();
};
content += "--" + cBoundary + "--\r\n";
MimePart::prepare();
}
void MimeMultiPart::setMimeType(const MultiPartType type)
{
this->type = type;
this->cType = MULTI_PART_NAMES[type];
}
MimeMultiPart::MultiPartType MimeMultiPart::getMimeType() const
{
return type;
}

View File

@@ -1,5 +1,5 @@
#include "sendemailthread.h"
#include "sendemail/smtpmime.h"
#include "smtpmime.h"
#pragma execution_character_set("utf-8")
#define TIMEMS qPrintable(QTime::currentTime().toString("hh:mm:ss zzz"))

View File

@@ -1,6 +1,13 @@
#-------------------------------------------------
#
# Project created by QtCreator 2019-02-16T15:08:47
#
#-------------------------------------------------
QT += core gui
greaterThan(QT_MAJOR_VERSION, 4): QT += widgets
greaterThan(QT_MAJOR_VERSION, 5): QT += core5compat
android {QT += androidextras}
TARGET = ffmpegdemo

View File

@@ -1,9 +1,7 @@
#pragma execution_character_set("utf-8")
#include "widget.h"
#include <QApplication>
#include <QTextCodec>
#include <QDesktopWidget>
int main(int argc, char *argv[])
{
@@ -35,12 +33,5 @@ int main(int argc, char *argv[])
w.setWindowTitle("视频流播放ffmpeg内核 (QQ: 517216493)");
w.show();
//居中显示窗体
QDesktopWidget deskWidget;
int deskWidth = deskWidget.availableGeometry().width();
int deskHeight = deskWidget.availableGeometry().height();
QPoint movePoint(deskWidth / 2 - w.width() / 2, deskHeight / 2 - w.height() / 2);
w.move(movePoint);
return a.exec();
}

View File

@@ -7,6 +7,7 @@
QT += core gui
greaterThan(QT_MAJOR_VERSION, 4): QT += widgets
greaterThan(QT_MAJOR_VERSION, 5): QT += core5compat
TARGET = flatui
TEMPLATE = app

View File

@@ -4,7 +4,6 @@
#include "ui_frmflatui.h"
#include "flatui.h"
#include "qdebug.h"
#include "qdesktopwidget.h"
#include "qdatetime.h"
frmFlatUI::frmFlatUI(QWidget *parent) : QWidget(parent), ui(new Ui::frmFlatUI)
@@ -58,7 +57,7 @@ void frmFlatUI::initForm()
FlatUI::setScrollBarQss(ui->verticalScrollBar, 8, 120, 20, "#606060", "#34495E", "#1ABC9C", "#E74C3C");
//设置列数和列宽
int width = qApp->desktop()->availableGeometry().width() - 120;
int width = 1920;
ui->tableWidget->setColumnCount(5);
ui->tableWidget->setColumnWidth(0, width * 0.06);
ui->tableWidget->setColumnWidth(1, width * 0.10);
@@ -82,7 +81,6 @@ void frmFlatUI::initForm()
for (int i = 0; i < 300; i++) {
ui->tableWidget->setRowHeight(i, 24);
QTableWidgetItem *itemDeviceID = new QTableWidgetItem(QString::number(i + 1));
QTableWidgetItem *itemDeviceName = new QTableWidgetItem(QString("测试设备%1").arg(i + 1));
QTableWidgetItem *itemDeviceAddr = new QTableWidgetItem(QString::number(i + 1));
@@ -95,5 +93,4 @@ void frmFlatUI::initForm()
ui->tableWidget->setItem(i, 3, itemContent);
ui->tableWidget->setItem(i, 4, itemTime);
}
}

View File

@@ -9,7 +9,7 @@ int main(int argc, char *argv[])
QApplication a(argc, argv);
a.setFont(QFont("Microsoft Yahei", 9));
#if (QT_VERSION <= QT_VERSION_CHECK(5,0,0))
#if (QT_VERSION < QT_VERSION_CHECK(5,0,0))
#if _MSC_VER
QTextCodec *codec = QTextCodec::codecForName("gbk");
#else

View File

@@ -7,6 +7,7 @@
QT += core gui
greaterThan(QT_MAJOR_VERSION, 4): QT += widgets
greaterThan(QT_MAJOR_VERSION, 5): QT += core5compat
TARGET = framelesswidget
TEMPLATE = app

View File

@@ -36,7 +36,7 @@ void frmFramelessWidget::initWidget(QWidget *w)
//设置下背景颜色区别看
QPalette palette = w->palette();
palette.setBrush(QPalette::Background, QColor(162, 121, 197));
palette.setBrush(QPalette::Window, QColor(162, 121, 197));
w->setPalette(palette);
QPushButton *btn = new QPushButton(w);

View File

@@ -9,7 +9,7 @@ int main(int argc, char *argv[])
QApplication a(argc, argv);
a.setFont(QFont("Microsoft Yahei", 9));
#if (QT_VERSION <= QT_VERSION_CHECK(5,0,0))
#if (QT_VERSION < QT_VERSION_CHECK(5,0,0))
#if _MSC_VER
QTextCodec *codec = QTextCodec::codecForName("gbk");
#else

View File

@@ -13,13 +13,19 @@
#include "qtimer.h"
#include "qdatetime.h"
#include "qapplication.h"
#include "qdesktopwidget.h"
#include "qdesktopservices.h"
#include "qfiledialog.h"
#include "qurl.h"
#include "qdebug.h"
#if (QT_VERSION > QT_VERSION_CHECK(5,0,0))
#if (QT_VERSION >= QT_VERSION_CHECK(5,0,0))
#include "qscreen.h"
#define deskGeometry qApp->primaryScreen()->geometry()
#define deskGeometry2 qApp->primaryScreen()->availableGeometry()
#else
#include "qdesktopwidget.h"
#define deskGeometry qApp->desktop()->geometry()
#define deskGeometry2 qApp->desktop()->availableGeometry()
#endif
QScopedPointer<GifWidget> GifWidget::self;
@@ -267,7 +273,7 @@ void GifWidget::saveImage()
return;
}
#if (QT_VERSION <= QT_VERSION_CHECK(5,0,0))
#if (QT_VERSION < QT_VERSION_CHECK(5,0,0))
//由于qt4没有RGBA8888,采用最接近RGBA8888的是ARGB32,颜色会有点偏差
QPixmap pix = QPixmap::grabWindow(0, x() + rectGif.x(), y() + rectGif.y(), rectGif.width(), rectGif.height());
QImage image = pix.toImage().convertToFormat(QImage::Format_ARGB32);

View File

@@ -7,6 +7,7 @@
QT += core gui
greaterThan(QT_MAJOR_VERSION, 4): QT += widgets
greaterThan(QT_MAJOR_VERSION, 5): QT += core5compat
TARGET = gifwidget
TEMPLATE = app

View File

@@ -11,7 +11,7 @@ int main(int argc, char *argv[])
a.setFont(QFont("Microsoft Yahei", 9));
a.setWindowIcon(QIcon(":/image/gifwidget.ico"));
#if (QT_VERSION <= QT_VERSION_CHECK(5,0,0))
#if (QT_VERSION < QT_VERSION_CHECK(5,0,0))
#if _MSC_VER
QTextCodec *codec = QTextCodec::codecForName("gbk");
#else

View File

@@ -7,6 +7,7 @@
QT += core gui
greaterThan(QT_MAJOR_VERSION, 4): QT += widgets
greaterThan(QT_MAJOR_VERSION, 5): QT += core5compat
TARGET = imageswitch
TEMPLATE = app

Binary file not shown.

Before

Width:  |  Height:  |  Size: 19 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 21 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 18 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 16 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 20 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 16 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 18 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 332 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 349 B

View File

@@ -1,59 +0,0 @@
#include "graphicspixmap.h"
#include <QGraphicsSceneMouseEvent>
#include <QPainter>
#include <QCursor>
#include <QDebug>
GraphicsPixmap::GraphicsPixmap() : QGraphicsObject()
{
setCacheMode(DeviceCoordinateCache);
}
void GraphicsPixmap::mousePressEvent(QGraphicsSceneMouseEvent *event)
{
QGraphicsObject::mousePressEvent(event);
if (event->button() == Qt::LeftButton)
{
emit clicked();
}
}
void GraphicsPixmap::setItemOffset(QPointF ponit)
{
prepareGeometryChange();
offset = ponit;
update();
}
QPointF GraphicsPixmap::itemoffset()
{
return offset;
}
void GraphicsPixmap::setPixmap(const QPixmap& pixmap)
{
pixSize = pixmap.size();
pix = pixmap;
}
void GraphicsPixmap::setPixmapSize(QSize size)
{
pixSize = size;
}
QSize GraphicsPixmap::pixsize()
{
return pixSize;
}
QRectF GraphicsPixmap::boundingRect() const
{
return QRectF(offset, pix.size() / pix.devicePixelRatio());
}
void GraphicsPixmap::paint(QPainter *painter, const QStyleOptionGraphicsItem *, QWidget *)
{
painter->setRenderHint(QPainter::SmoothPixmapTransform, true);
painter->drawPixmap(offset, pix.scaled(pixSize, Qt::KeepAspectRatio, Qt::SmoothTransformation));
}

View File

@@ -1,38 +0,0 @@
#ifndef GRAPHICSPIXMAP_H
#define GRAPHICSPIXMAP_H
#include <QObject>
#include <QGraphicsObject>
#include <QPixmap>
class GraphicsPixmap : public QGraphicsObject
{
Q_OBJECT
Q_PROPERTY(QPointF itemoffset READ itemoffset WRITE setItemOffset)
Q_PROPERTY(QSize itemsize READ pixsize WRITE setPixmapSize)
public:
GraphicsPixmap();
public:
QRectF boundingRect() const Q_DECL_OVERRIDE;
void setItemOffset(QPointF ponit);
QPointF itemoffset();
QSize pixsize();
void setPixmap(const QPixmap& pixmap);
void setPixmapSize(QSize size);
signals:
void clicked();
private:
void mousePressEvent(QGraphicsSceneMouseEvent *event) Q_DECL_OVERRIDE;
void paint(QPainter *, const QStyleOptionGraphicsItem *, QWidget *) Q_DECL_OVERRIDE;
private:
QPixmap pix;
QPointF offset;
QSize pixSize;
};
#endif // GRAPHICSPIXMAP_H

View File

@@ -1,18 +0,0 @@
#include "graphicsview.h"
GraphicsView::GraphicsView(QGraphicsScene *scene)
: QGraphicsView(scene)
{
}
GraphicsView::~GraphicsView()
{
}
void GraphicsView::resizeEvent(QResizeEvent *event)
{
QGraphicsView::resizeEvent(event);
fitInView(sceneRect(), Qt::KeepAspectRatio);
}

View File

@@ -1,18 +0,0 @@
#ifndef GRAPHICSVIEW_H
#define GRAPHICSVIEW_H
#include <QGraphicsView>
class GraphicsView : public QGraphicsView
{
Q_OBJECT
public:
GraphicsView(QGraphicsScene *scene);
~GraphicsView();
protected:
void resizeEvent(QResizeEvent *event) Q_DECL_OVERRIDE;
};
#endif // GRAPHICSVIEW_H

View File

@@ -1,211 +0,0 @@
#include "imageviewwindow.h"
#include "graphicsview.h"
#include "graphicspixmap.h"
#include <QParallelAnimationGroup>
#include <QPropertyAnimation>
#include <QDebug>
#include <QTimer>
const int image_conunt = 5;
const int image_yoffset = 40;
const int image_xoffset = 60;
ImageViewWindow::ImageViewWindow(QWidget *parent)
: QWidget(parent)
, m_isStart(false)
{
ui.setupUi(this);
initControl();
}
ImageViewWindow::~ImageViewWindow()
{
}
void ImageViewWindow::initControl()
{
//场景
m_scene = new QGraphicsScene(QRect(0, 0, 876, 368), this);
//图片信息
m_imgMapInfolst << QMap<QString, QString>{
{ "zIndex" , "1" },
{ "width" , "120" },
{ "height" , "150" },
{ "top" , "71" },
{ "left" , "134" },
{ "opacity" , "0.6" }
};
m_imgMapInfolst << QMap<QString, QString>{
{ "zIndex", "2" },
{ "width", "130" },
{ "height", "170" },
{ "top", "61" },
{ "left", "0" },
{ "opacity", "0.7" }
};
m_imgMapInfolst << QMap<QString, QString>{
{ "zIndex", "3" },
{ "width", "170" },
{ "height", "218" },
{ "top", "37" },
{ "left", "110" },
{ "opacity", "0.8" }
};
m_imgMapInfolst << QMap<QString, QString>{
{ "zIndex", "4" },
{ "width", "224" },
{ "height", "288" },
{ "top", "0" },
{ "left", "262" },
{ "opacity", "1" }
};
m_imgMapInfolst << QMap<QString, QString>{
{ "zIndex", "3" },
{ "width", "170" },
{ "height", "218" },
{ "top", "37" },
{ "left", "468" },
{ "opacity", "0.8" }
};
m_imgMapInfolst << QMap<QString, QString>{
{ "zIndex", "2" },
{ "width", "130" },
{ "height", "170" },
{ "top", "61" },
{ "left", "620" },
{ "opacity", "0.7" }
};
m_imgMapInfolst << QMap<QString, QString>{
{ "zIndex", "1" },
{ "width", "120" },
{ "height", "150" },
{ "top", "71" },
{ "left", "496" },
{ "opacity", "0.6" }
};
//场景中添加图片元素
for (int index = 0; index < m_imgMapInfolst.size(); index++)
{
const auto imageInfoMap = m_imgMapInfolst[index];
const QString&& centerImg = QString(":/ImageViewWindow/Resources/%1.jpg").arg(index + 1);
const QPixmap&& pixmap = QPixmap(centerImg);
GraphicsPixmap *item = new GraphicsPixmap();
item->setPixmap(pixmap);
item->setPixmapSize(QSize(imageInfoMap["width"].toInt(), imageInfoMap["height"].toInt()));
item->setItemOffset(QPointF(imageInfoMap["left"].toInt() + image_xoffset, imageInfoMap["top"].toInt() + image_yoffset));
item->setZValue(imageInfoMap["zIndex"].toInt());
item->setOpacity(imageInfoMap["opacity"].toFloat());
m_items << item;
m_scene->addItem(item);
}
//left button
GraphicsPixmap *leftBtn = new GraphicsPixmap();
leftBtn->setCursor(QCursor(Qt::PointingHandCursor));
leftBtn->setPixmap(QPixmap(":/ImageViewWindow/Resources/Wblog_left.png"));
leftBtn->setItemOffset(QPointF(12, image_yoffset + 124));
leftBtn->setZValue(5);
m_scene->addItem(leftBtn);
connect(leftBtn, SIGNAL(clicked()), this, SLOT(onLeftBtnClicked()));
//right button
GraphicsPixmap *rightBtn = new GraphicsPixmap();
rightBtn->setCursor(QCursor(Qt::PointingHandCursor));
rightBtn->setPixmap(QPixmap(":/ImageViewWindow/Resources/Wblog_right.png"));
rightBtn->setItemOffset(QPointF(836, image_yoffset + 124));
rightBtn->setZValue(5);
m_scene->addItem(rightBtn);
connect(rightBtn, SIGNAL(clicked()), this, SLOT(onRightBtnClicked()));
//视图
GraphicsView *view = new GraphicsView(m_scene);
view->setFrameShape(QFrame::NoFrame);
view->setParent(this);
view->setViewportUpdateMode(QGraphicsView::BoundingRectViewportUpdate);
view->setBackgroundBrush(QColor(46, 46, 46));
view->setCacheMode(QGraphicsView::CacheBackground);
view->setRenderHints(QPainter::Antialiasing | QPainter::SmoothPixmapTransform);
ui.viewlayout->addWidget(view);
//动画: 大小,位置
m_group = new QParallelAnimationGroup;
for (int i = 0; i < m_items.count(); ++i) {
QPropertyAnimation *anim = new QPropertyAnimation(m_items[i], "itemoffset");
QPropertyAnimation *anims = new QPropertyAnimation(m_items[i], "itemsize");
m_animationMap.insert(m_items[i], anim);
m_animationsMap.insert(m_items[i], anims);
anim->setDuration(1000);
anims->setDuration(1000);
anim->setEasingCurve(QEasingCurve::OutQuad);
anims->setEasingCurve(QEasingCurve::OutQuad);
m_group->addAnimation(anim);
m_group->addAnimation(anims);
}
//定时切换图片
m_timer = new QTimer(this);
m_timer->setInterval(2000);
connect(m_timer, &QTimer::timeout, [this](){
nextPlay();
});
connect(m_group, &QParallelAnimationGroup::finished, [this](){
m_isStart = false;
m_timer->start();
});
m_timer->start();
}
void ImageViewWindow::onLeftBtnClicked()
{
//鼠标点击的时候,先暂停定时器预览
m_timer->stop();
//上一张
lastPlay();
}
void ImageViewWindow::onRightBtnClicked()
{
//鼠标点击的时候,先暂停定时器预览
m_timer->stop();
//下一张
nextPlay();
}
void ImageViewWindow::play()
{
for (int index = 0; index < m_imgMapInfolst.size(); index++)
{
const auto item = m_items[index];
QPropertyAnimation *anim = m_animationMap.value(item);
QPropertyAnimation *anims = m_animationsMap.value(item);
const auto imageInfoMap = m_imgMapInfolst[index];
item->setZValue(imageInfoMap["zIndex"].toInt());
item->setOpacity(imageInfoMap["opacity"].toFloat());
QPointF pointf(imageInfoMap["left"].toInt() + image_xoffset, imageInfoMap["top"].toInt() + image_yoffset);
const QString&& centerImg = QString(":/ImageViewWindow/Resources/%1.jpg").arg(index + 1);
anim->setStartValue(item->itemoffset());
anims->setStartValue(item->pixsize());
anim->setEndValue(pointf);
anims->setEndValue(QSize(imageInfoMap["width"].toInt(), imageInfoMap["height"].toInt()));
}
m_isStart = true;
}
void ImageViewWindow::nextPlay()
{
m_group->stop();
auto firstItem = m_items.takeAt(0);
m_items << firstItem;
play();
m_group->start();
}
void ImageViewWindow::lastPlay()
{
m_group->stop();
auto lastItem = m_items.takeAt(m_items.size() - 1);
m_items.prepend(lastItem);
play();
m_group->start();
}

View File

@@ -1,42 +0,0 @@
#ifndef IMAGEVIEWWINDOW_H
#define IMAGEVIEWWINDOW_H
#include <QtWidgets/QWidget>
#include "ui_imageviewwindow.h"
class QTimer;
class QPropertyAnimation;
class GraphicsPixmap;
class QGraphicsScene;
class QParallelAnimationGroup;
class ImageViewWindow : public QWidget
{
Q_OBJECT
public:
ImageViewWindow(QWidget *parent = 0);
~ImageViewWindow();
private:
void initControl();
void nextPlay();
void lastPlay();
void play();
private slots:
void onLeftBtnClicked();
void onRightBtnClicked();
private:
Ui::ImageViewWindowClass ui;
QGraphicsScene* m_scene;
QList<QMap<QString, QString>> m_imgMapInfolst;
QList<GraphicsPixmap *> m_items;
QParallelAnimationGroup *m_group;
QMap<GraphicsPixmap *, QPropertyAnimation *> m_animationMap;
QMap<GraphicsPixmap *, QPropertyAnimation *> m_animationsMap;
QTimer* m_timer;
bool m_isStart;
};
#endif // IMAGEVIEWWINDOW_H

View File

@@ -1,22 +0,0 @@
QT += core gui
greaterThan(QT_MAJOR_VERSION, 4): QT += widgets
TARGET = imageviewwindow
TEMPLATE = app
DESTDIR = $$PWD/../bin
CONFIG += warn_off
HEADERS += graphicsview.h
HEADERS += graphicspixmap.h
HEADERS += imageviewwindow.h
SOURCES += graphicspixmap.cpp
SOURCES += graphicsview.cpp
SOURCES += imageviewwindow.cpp
SOURCES += main.cpp
FORMS += imageviewwindow.ui
RESOURCES += imageviewwindow.qrc

View File

@@ -1,13 +0,0 @@
<RCC>
<qresource prefix="/ImageViewWindow">
<file>Resources/1.jpg</file>
<file>Resources/2.jpg</file>
<file>Resources/3.jpg</file>
<file>Resources/4.jpg</file>
<file>Resources/5.jpg</file>
<file>Resources/6.jpg</file>
<file>Resources/7.jpg</file>
<file>Resources/Wblog_left.png</file>
<file>Resources/Wblog_right.png</file>
</qresource>
</RCC>

View File

@@ -1,39 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
<class>ImageViewWindowClass</class>
<widget class="QWidget" name="ImageViewWindowClass">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>1062</width>
<height>538</height>
</rect>
</property>
<property name="windowTitle">
<string>ImageViewWindow</string>
</property>
<layout class="QVBoxLayout" name="viewlayout">
<property name="spacing">
<number>0</number>
</property>
<property name="leftMargin">
<number>0</number>
</property>
<property name="topMargin">
<number>0</number>
</property>
<property name="rightMargin">
<number>0</number>
</property>
<property name="bottomMargin">
<number>0</number>
</property>
</layout>
</widget>
<layoutdefault spacing="6" margin="11"/>
<resources>
<include location="imageviewwindow.qrc"/>
</resources>
<connections/>
</ui>

Some files were not shown because too many files have changed in this diff Show More