Add Qt6 support (does not switch to Qt6) (#73)

Prepares us to move to qt6 when it is widely available for osx.
* use Qt6 constant for DataLocation
* append using QString.arg
* remove unncessary includes
* use setContentMargins over deprecated setMargin
* Use Qt constant over dep. QString version
* include missing QFile include
* return an actual orientation instead of 0
* use OR to reflect that the keys are flags
* write settings tags as QVariantList instead of vec
* Only register tag streams if pre-Qt6
* fix double #if
* no need to register TagVector -- not used anymore
* update UGlobalHotkeys submod ule
* add in missing header
main
Joel Smith 2021-02-24 16:48:07 -08:00 committed by GitHub
parent 6726afe3d1
commit 9f1e863881
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
17 changed files with 58 additions and 65 deletions

View File

@ -4,6 +4,7 @@
#ifndef APPSETTINGS_H
#define APPSETTINGS_H
#include <QSequentialIterable>
#include <QSettings>
#include <QString>
@ -56,11 +57,28 @@ class AppSettings : public QObject {
QString operationName() { return settings.value(opNameSetting).toString(); }
void setLastUsedTags(std::vector<model::Tag> lastTags) {
settings.setValue(lastUsedTagsSetting, QVariant::fromValue(lastTags));
QVariantList writeTags;
for (auto tag : lastTags) {
writeTags << QVariant::fromValue(tag);
}
settings.setValue(lastUsedTagsSetting, QVariant::fromValue(writeTags));
}
std::vector<model::Tag> getLastUsedTags() {
std::vector<model::Tag> rtn;
auto val = settings.value(lastUsedTagsSetting);
return qvariant_cast<std::vector<model::Tag>>(val);
if (val.canConvert<QVariantList>()) {
QSequentialIterable iter = val.value<QSequentialIterable>();
for (const QVariant& item : iter) {
rtn.push_back(qvariant_cast<model::Tag>(item));
}
}
return rtn;
}
};
#endif // APPSETTINGS_H

View File

@ -15,7 +15,7 @@ ImageView::~ImageView() {
void ImageView::buildUi() {
gridLayout = new QGridLayout(this);
gridLayout->setMargin(0);
gridLayout->setContentsMargins(0, 0, 0, 0);
previewImage = new AspectRatioPixmapLabel(this);
previewImage->setSizePolicy(QSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding));

View File

@ -19,7 +19,7 @@ CodeBlockView::~CodeBlockView() {
void CodeBlockView::buildUi() {
gridLayout = new QGridLayout(this);
gridLayout->setMargin(0);
gridLayout->setContentsMargins(0, 0, 0, 0);
_languageLabel = new QLabel("Language", this);
_sourceLabel = new QLabel("Source", this);

View File

@ -13,7 +13,7 @@ ErrorView::~ErrorView() {
void ErrorView::buildUi() {
gridLayout = new QGridLayout(this);
gridLayout->setMargin(0);
gridLayout->setContentsMargins(0, 0, 0, 0);
errorLabel = new QLabel(errorText, this);

View File

@ -3,6 +3,7 @@
#include "evidenceeditor.h"
#include <QFile>
#include <vector>
#include "components/aspectratio_pixmap_label/imageview.h"
@ -41,7 +42,7 @@ EvidenceEditor::~EvidenceEditor() {
void EvidenceEditor::buildUi() {
gridLayout = new QGridLayout(this);
gridLayout->setMargin(0);
gridLayout->setContentsMargins(0, 0, 0, 0);
splitter = new QSplitter(this);
splitter->setOrientation(Qt::Vertical);
@ -56,7 +57,7 @@ void EvidenceEditor::buildUi() {
descriptionArea->setLayout(descriptionAreaLayout);
descriptionAreaLayout->addWidget(_descriptionLabel);
descriptionAreaLayout->addWidget(descriptionTextBox);
descriptionAreaLayout->setMargin(0);
descriptionAreaLayout->setContentsMargins(0, 0, 0, 0);
// Layout
/* 0

View File

@ -100,7 +100,7 @@ QLayoutItem *FlowLayout::takeAt(int index) {
return nullptr;
}
Qt::Orientations FlowLayout::expandingDirections() const { return 0; }
Qt::Orientations FlowLayout::expandingDirections() const { return {}; }
bool FlowLayout::hasHeightForWidth() const { return true; }

View File

@ -33,7 +33,7 @@ TagEditor::~TagEditor() {
void TagEditor::buildUi() {
gridLayout = new QGridLayout(this);
gridLayout->setMargin(0);
gridLayout->setContentsMargins(0, 0, 0, 0);
couldNotCreateTagMsg = new QErrorMessage(this);

View File

@ -41,7 +41,7 @@ class TaggingLineEditEventFilter : public QObject {
if (event->type() == QEvent::KeyPress) {
QKeyEvent *ke = static_cast<QKeyEvent *>(event);
if (matchesKey(ke, QKeySequence(Qt::CTRL + Qt::Key_Space))) {
if (matchesKey(ke, QKeySequence(Qt::CTRL | Qt::Key_Space))) {
emit completePressed();
return true;
}

View File

@ -16,7 +16,7 @@ TagView::~TagView() {
void TagView::buildUi() {
mainLayout = new QHBoxLayout(this);
mainLayout->setMargin(0);
mainLayout->setContentsMargins(0, 0, 0, 0);
tagGroupBox = new QGroupBox("Tags", this);
layout = new FlowLayout();

View File

@ -133,14 +133,14 @@ Tri EvidenceFilters::parseTriFilterValue(const QString& text, bool strict) {
}
std::vector<std::pair<QString, QString>> EvidenceFilters::tokenizeFilterText(const QString& text) {
QStringList list = text.split(":", QString::SplitBehavior::SkipEmptyParts);
QStringList list = text.split(":", Qt::SkipEmptyParts);
// now in: [Key][value key]...[value] format
QStringList keys;
QStringList values;
keys.append(list.first());
for (int i = 1; i < list.size() - 1; i++) {
auto valueKeyPair = list.at(i).split(" ", QString::SplitBehavior::SkipEmptyParts);
auto valueKeyPair = list.at(i).split(" ", Qt::SkipEmptyParts);
keys.append(valueKeyPair.last());
valueKeyPair.removeLast();
values.append(valueKeyPair.join(" "));

View File

@ -8,6 +8,7 @@
#include <QString>
#include <utility>
#include <vector>
#include <QStringList>
enum Tri { Any, Yes, No };

View File

@ -292,10 +292,8 @@ void Settings::onTestRequestComplete() {
connStatusLabel->setText("Could not connect: Not Found (check URL)");
break;
default:
QString msg = "Could not connect: Unexpected Error (code: ";
msg.append(statusCode);
msg.append(")");
connStatusLabel->setText(msg);
QString msg = "Could not connect: Unexpected Error (code: %1)";
connStatusLabel->setText(msg.arg(statusCode));
}
}
else {

View File

@ -18,18 +18,18 @@ class Constants {
static QString configLocation() {
#ifdef Q_OS_MACOS
return QStandardPaths::writableLocation(QStandardPaths::DataLocation) + "/config.json";
return QStandardPaths::writableLocation(QStandardPaths::AppLocalDataLocation) + "/config.json";
#else
return QStandardPaths::writableLocation(QStandardPaths::ConfigLocation) + "/ashirt/config.json";
#endif
}
static QString dbLocation() {
return QStandardPaths::writableLocation(QStandardPaths::DataLocation) + "/evidence.sqlite";
return QStandardPaths::writableLocation(QStandardPaths::AppLocalDataLocation) + "/evidence.sqlite";
}
static QString defaultEvidenceRepo() {
return QStandardPaths::writableLocation(QStandardPaths::DataLocation) + "/evidence";
return QStandardPaths::writableLocation(QStandardPaths::AppLocalDataLocation) + "/evidence";
}
static QString releaseOwner() {

View File

@ -11,6 +11,7 @@ void handleCLI(std::vector<std::string> args);
#ifndef QT_NO_SYSTEMTRAYICON
#include <QApplication>
#include <QMessageBox>
#include <QMetaType>
#include "appconfig.h"
#include "appsettings.h"
@ -19,38 +20,6 @@ void handleCLI(std::vector<std::string> args);
#include "exceptions/fileerror.h"
#include "traymanager.h"
QDataStream& operator<<(QDataStream& out, const model::Tag& v) {
out << v.tagName << v.id << v.serverTagId;
return out;
}
QDataStream& operator>>(QDataStream& in, model::Tag& v) {
in >> v.tagName;
in >> v.id;
in >> v.serverTagId;
return in;
}
QDataStream& operator<<(QDataStream& out, const std::vector<model::Tag>& v) {
out << int(v.size());
for (const auto& tag : v) {
out << tag;
}
return out;
}
QDataStream& operator>>(QDataStream& in, std::vector<model::Tag>& v) {
int qty;
in >> qty;
v.reserve(qty);
for(int i = 0; i < qty; i++) {
model::Tag t;
in >> t;
v.push_back(t);
}
return in;
}
int main(int argc, char* argv[]) {
Q_INIT_RESOURCE(res_icons);
Q_INIT_RESOURCE(res_migrations);
@ -88,9 +57,11 @@ int main(int argc, char* argv[]) {
int rtn;
try {
#if QT_VERSION < QT_VERSION_CHECK(6, 0, 0)
qRegisterMetaTypeStreamOperators<model::Tag>("Tag");
qRegisterMetaTypeStreamOperators<std::vector<model::Tag>>("TagVector");
#endif
QApplication app(argc, argv);
qRegisterMetaType<model::Tag>();
if (!QSystemTrayIcon::isSystemTrayAvailable()) {
handleCLI(std::vector<std::string>(argv, argv + argc));

View File

@ -14,6 +14,7 @@ class Tag {
Tag() = default;
~Tag() = default;
Tag(const Tag &) = default;
Tag& operator=(const Tag&) = default;
Tag(qint64 id, qint64 evidenceID, qint64 tagId, QString name) : Tag(id, tagId, name) { this->evidenceId = evidenceID; }
Tag(qint64 id, qint64 tagId, QString name) : Tag(tagId, name) { this->id = id; }
@ -22,6 +23,19 @@ class Tag {
this->tagName = name;
}
public:
friend QDataStream& operator<<(QDataStream& out, const model::Tag& v) {
out << v.tagName << v.id << v.serverTagId;
return out;
}
friend QDataStream& operator>>(QDataStream& in, model::Tag& v) {
in >> v.tagName;
in >> v.id;
in >> v.serverTagId;
return in;
}
public:
qint64 id;
qint64 serverTagId;

View File

@ -7,23 +7,13 @@
#include <QAction>
#include <QApplication>
#include <QCheckBox>
#include <QCloseEvent>
#include <QComboBox>
#include <QCoreApplication>
#include <QDesktopWidget>
#include <QGroupBox>
#include <QLabel>
#include <QLineEdit>
#include <QMenu>
#include <QMessageBox>
#include <QPushButton>
#include <QSpinBox>
#include <QTextEdit>
#include <QVBoxLayout>
#include <iostream>
#include <QTimer>
#include <QDesktopServices>
#include <iostream>
#include "appconfig.h"
#include "appsettings.h"

@ -1 +1 @@
Subproject commit 4b1049f8e5248ac816b6b90dfa0e70c54b9b8306
Subproject commit 2f17fe1ec8dbbb00418d55343b9529dcfa93f264