IJHack / QtPass

QtPass is a multi-platform GUI for pass, the standard unix password manager.
https://qtpass.org/
GNU General Public License v3.0
1.03k stars 162 forks source link

Issue #402: 'deselect()' on clearing filter #490

Closed petr-nehez closed 5 years ago

petr-nehez commented 5 years ago

My first PR as it tourned out that the fix for my issue could be really fast.

coveralls commented 5 years ago

Coverage Status

Coverage increased (+0.01%) to 7.103% when pulling 134c452759dca7bc60ee474847bb6aa83b9065e4 on petr-nehez:issue-402 into 30fc277ae8e8e2bcea8740c093994d148ea179a3 on IJHack:master.

petr-nehez commented 5 years ago

@annejan How can I trigger Travis again? One build timed out...

codecov[bot] commented 5 years ago

Codecov Report

Merging #490 into master will increase coverage by 2.21%. The diff coverage is 0%.

Impacted file tree graph

@@            Coverage Diff            @@
##           master    #490      +/-   ##
=========================================
+ Coverage    7.14%   9.36%   +2.21%     
=========================================
  Files          44      46       +2     
  Lines        2854    2925      +71     
=========================================
+ Hits          204     274      +70     
- Misses       2650    2651       +1
Impacted Files Coverage Δ
src/mainwindow.cpp 0% <0%> (ø) :arrow_up:
tests/auto/util/tst_util.cpp 100% <0%> (ø)
tests/auto/ui/tst_ui.cpp 100% <0%> (ø)

Continue to review full report at Codecov.

Legend - Click here to learn more Δ = absolute <relative> (impact), ø = not affected, ? = missing data Powered by Codecov. Last update 30fc277...134c452. Read the comment docs.

petr-nehez commented 5 years ago

What is the problem with codecov? I don't have no experience with that so far that's why I have no idea what to do with that...

annejan commented 5 years ago

There is no issue with codecov I should probably remove the bot . .

It is complaining that the code coverage (which is very low anyway) went down with 0.001% or so 😉

annejan commented 5 years ago

Thank you for this nice and clean fix . .

petr-nehez commented 5 years ago

I am happy to contribute. I am not a C++ developper at all (my daily job is Java in IntelliJ) and I tried to open the project in CLion but without success to build it. Do you know whether it is possible to import it into CLion and compile it there?

annejan commented 5 years ago

Importing into CLion should be trivial . .

Compiling is "just" Makefiles after the qmake step . .

I'll have a quick look at it this afternoon

annejan commented 5 years ago

Well . . I got this far with the CMakeLists.txt https://github.com/IJHack/QtPass/blob/CMake/CMakeLists.txt

➜  cmake .
-- Configuring done
-- Generating done
-- Build files have been written to: /Users/annejan/Projects/qtpass

➜  make

[  1%] Automatic UIC for target qtpasslib
[  1%] Built target qtpasslib_autogen
[  3%] Generating localization/localization_nl_NL.qm
Updating 'localization/localization_nl_NL.qm'...
    Generated 189 translation(s) (189 finished and 0 unfinished)
[  5%] Generating localization/localization_it_IT.qm
Updating 'localization/localization_it_IT.qm'...
    Generated 177 translation(s) (177 finished and 0 unfinished)
    Ignored 12 untranslated source text(s)
[  7%] Generating localization/localization_es_ES.qm
Updating 'localization/localization_es_ES.qm'...
    Generated 99 translation(s) (99 finished and 0 unfinished)
... (etc ...
Scanning dependencies of target qtpasslib
[ 53%] Building CXX object CMakeFiles/qtpasslib.dir/src/configdialog.cpp.o
[ 55%] Building CXX object CMakeFiles/qtpasslib.dir/src/executor.cpp.o
[ 57%] Building CXX object CMakeFiles/qtpasslib.dir/src/filecontent.cpp.o
[ 59%] Building CXX object CMakeFiles/qtpasslib.dir/src/imitatepass.cpp.o
[ 61%] Building CXX object CMakeFiles/qtpasslib.dir/src/keygendialog.cpp.o
[ 62%] Building CXX object CMakeFiles/qtpasslib.dir/src/mainwindow.cpp.o
[ 64%] Building CXX object CMakeFiles/qtpasslib.dir/src/pass.cpp.o
[ 66%] Building CXX object CMakeFiles/qtpasslib.dir/src/passworddialog.cpp.o
[ 68%] Building CXX object CMakeFiles/qtpasslib.dir/src/qprogressindicator.cpp.o
[ 70%] Building CXX object CMakeFiles/qtpasslib.dir/src/qpushbuttonasqrcode.cpp.o
[ 72%] Building CXX object CMakeFiles/qtpasslib.dir/src/qpushbuttonwithclipboard.cpp.o
[ 74%] Building CXX object CMakeFiles/qtpasslib.dir/src/qtpass.cpp.o
[ 75%] Building CXX object CMakeFiles/qtpasslib.dir/src/qtpasssettings.cpp.o
[ 77%] Building CXX object CMakeFiles/qtpasslib.dir/src/realpass.cpp.o
[ 79%] Building CXX object CMakeFiles/qtpasslib.dir/src/settingsconstants.cpp.o
[ 81%] Building CXX object CMakeFiles/qtpasslib.dir/src/simpletransaction.cpp.o
[ 83%] Building CXX object CMakeFiles/qtpasslib.dir/src/singleapplication.cpp.o
[ 85%] Building CXX object CMakeFiles/qtpasslib.dir/src/storemodel.cpp.o
[ 87%] Building CXX object CMakeFiles/qtpasslib.dir/src/trayicon.cpp.o
[ 88%] Building CXX object CMakeFiles/qtpasslib.dir/src/usersdialog.cpp.o
[ 90%] Building CXX object CMakeFiles/qtpasslib.dir/src/util.cpp.o
[ 92%] Building CXX object CMakeFiles/qtpasslib.dir/qtpasslib_autogen/EWIEGA46WW/qrc_resources.cpp.o
[ 94%] Linking CXX static library libqtpasslib.a
[ 94%] Built target qtpasslib
[ 96%] Automatic UIC for target qtpass
[ 96%] Built target qtpass_autogen
[ 98%] Building CXX object CMakeFiles/qtpass.dir/main/main.cpp.o
[100%] Linking CXX executable qtpass
Undefined symbols for architecture x86_64:
  "MainWindow::staticMetaObject", referenced from:
      MainWindow::tr(char const*, char const*, int) in libqtpasslib.a(mainwindow.cpp.o)
      QMetaObject::Connection QObject::connect<void (MainWindow::*)(QString), void (QtPass::*)(QString)>(QtPrivate::FunctionPointer<void (MainWindow::*)(QString)>::Object const*, void (MainWindow::*)(QString), QtPrivate::FunctionPointer<void (QtPass::*)(QString)>::Object const*, void (QtPass::*)(QString), Qt::ConnectionType) in libqtpasslib.a(qtpass.cpp.o)
      std::__1::enable_if<(QtPrivate::FunctionPointer<QtPass::setMainWindow()::$_0>::ArgumentCount) == (-(1)), QMetaObject::Connection>::type QObject::connect<void (MainWindow::*)(), QtPass::setMainWindow()::$_0>(QtPrivate::FunctionPointer<void (MainWindow::*)()>::Object const*, void (MainWindow::*)(), QObject const*, QtPass::setMainWindow()::$_0, Qt::ConnectionType) in libqtpasslib.a(qtpass.cpp.o)
      std::__1::enable_if<(QtPrivate::FunctionPointer<QtPass::setMainWindow()::$_1>::ArgumentCount) == (-(1)), QMetaObject::Connection>::type QObject::connect<void (MainWindow::*)(QString), QtPass::setMainWindow()::$_1>(QtPrivate::FunctionPointer<void (MainWindow::*)(QString)>::Object const*, void (MainWindow::*)(QString), QObject const*, QtPass::setMainWindow()::$_1, Qt::ConnectionType) in libqtpasslib.a(qtpass.cpp.o)
  "MainWindow::passGitInitNeeded()", referenced from:
      ConfigDialog::wizard() in libqtpasslib.a(configdialog.cpp.o)
      QtPass::setMainWindow() in libqtpasslib.a(qtpass.cpp.o)
  "MainWindow::generateGPGKeyPair(QString)", referenced from:
      MainWindow::generateKeyPair(QString, QDialog*) in libqtpasslib.a(mainwindow.cpp.o)
      QtPass::setMainWindow() in libqtpasslib.a(qtpass.cpp.o)
  "MainWindow::passShowHandlerFinished(QString)", referenced from:
      MainWindow::passShowHandler(QString const&) in libqtpasslib.a(mainwindow.cpp.o)
      QtPass::setMainWindow() in libqtpasslib.a(qtpass.cpp.o)
  "StoreModel::staticMetaObject", referenced from:
      StoreModel::tr(char const*, char const*, int) in libqtpasslib.a(storemodel.cpp.o)
  "ImitatePass::endReencryptPath()", referenced from:
      QtPass::setMainWindow() in libqtpasslib.a(qtpass.cpp.o)
      ImitatePass::reencryptPath(QString const&) in libqtpasslib.a(imitatepass.cpp.o)
  "ImitatePass::staticMetaObject", referenced from:
      QMetaObject::Connection QObject::connect<void (ImitatePass::*)(), void (MainWindow::*)()>(QtPrivate::FunctionPointer<void (ImitatePass::*)()>::Object const*, void (ImitatePass::*)(), QtPrivate::FunctionPointer<void (MainWindow::*)()>::Object const*, void (MainWindow::*)(), Qt::ConnectionType) in libqtpasslib.a(qtpass.cpp.o)
      ImitatePass::tr(char const*, char const*, int) in libqtpasslib.a(imitatepass.cpp.o)
  "ImitatePass::startReencryptPath()", referenced from:
      QtPass::setMainWindow() in libqtpasslib.a(qtpass.cpp.o)
      ImitatePass::reencryptPath(QString const&) in libqtpasslib.a(imitatepass.cpp.o)
  "UsersDialog::staticMetaObject", referenced from:
      UsersDialog::tr(char const*, char const*, int) in libqtpasslib.a(usersdialog.cpp.o)
  "ConfigDialog::staticMetaObject", referenced from:
      ConfigDialog::tr(char const*, char const*, int) in libqtpasslib.a(configdialog.cpp.o)
  "KeygenDialog::staticMetaObject", referenced from:
      KeygenDialog::tr(char const*, char const*, int) in libqtpasslib.a(keygendialog.cpp.o)
  "QPushButtonAsQRCode::staticMetaObject", referenced from:
      QMetaObject::Connection QObject::connect<void (QPushButtonAsQRCode::*)(QString), void (QtPass::*)(QString const&)>(QtPrivate::FunctionPointer<void (QPushButtonAsQRCode::*)(QString)>::Object const*, void (QPushButtonAsQRCode::*)(QString), QtPrivate::FunctionPointer<void (QtPass::*)(QString const&)>::Object const*, void (QtPass::*)(QString const&), Qt::ConnectionType) in libqtpasslib.a(mainwindow.cpp.o)
  "QPushButtonAsQRCode::clicked(QString)", referenced from:
      MainWindow::addToGridLayout(int, QString const&, QString const&) in libqtpasslib.a(mainwindow.cpp.o)
      QPushButtonAsQRCode::buttonClicked(bool) in libqtpasslib.a(qpushbuttonasqrcode.cpp.o)
  "DeselectableTreeView::emptyClicked()", referenced from:
      MainWindow::MainWindow(QString const&, QWidget*) in libqtpasslib.a(mainwindow.cpp.o)
  "DeselectableTreeView::staticMetaObject", referenced from:
      QMetaObject::Connection QObject::connect<void (DeselectableTreeView::*)(), void (MainWindow::*)()>(QtPrivate::FunctionPointer<void (DeselectableTreeView::*)()>::Object const*, void (DeselectableTreeView::*)(), QtPrivate::FunctionPointer<void (MainWindow::*)()>::Object const*, void (MainWindow::*)(), Qt::ConnectionType) in libqtpasslib.a(mainwindow.cpp.o)
  "QPushButtonWithClipboard::staticMetaObject", referenced from:
      QMetaObject::Connection QObject::connect<void (QPushButtonWithClipboard::*)(QString), void (QtPass::*)(QString const&)>(QtPrivate::FunctionPointer<void (QPushButtonWithClipboard::*)(QString)>::Object const*, void (QPushButtonWithClipboard::*)(QString), QtPrivate::FunctionPointer<void (QtPass::*)(QString const&)>::Object const*, void (QtPass::*)(QString const&), Qt::ConnectionType) in libqtpasslib.a(mainwindow.cpp.o)
  "QPushButtonWithClipboard::clicked(QString)", referenced from:
      MainWindow::addToGridLayout(int, QString const&, QString const&) in libqtpasslib.a(mainwindow.cpp.o)
      QPushButtonWithClipboard::buttonClicked(bool) in libqtpasslib.a(qpushbuttonwithclipboard.cpp.o)
  "Pass::qt_metacall(QMetaObject::Call, int, void**)", referenced from:
      vtable for RealPass in libqtpasslib.a(realpass.cpp.o)
  "Pass::qt_metacast(char const*)", referenced from:
      vtable for RealPass in libqtpasslib.a(realpass.cpp.o)
  "Pass::finishedCopy(QString const&, QString const&)", referenced from:
      Pass::finished(int, int, QString const&, QString const&) in libqtpasslib.a(pass.cpp.o)
      QtPass::connectPassSignalHandlers(Pass*) in libqtpasslib.a(qtpass.cpp.o)
  "Pass::finishedInit(QString const&, QString const&)", referenced from:
      Pass::finished(int, int, QString const&, QString const&) in libqtpasslib.a(pass.cpp.o)
      QtPass::connectPassSignalHandlers(Pass*) in libqtpasslib.a(qtpass.cpp.o)
  "Pass::finishedMove(QString const&, QString const&)", referenced from:
      Pass::finished(int, int, QString const&, QString const&) in libqtpasslib.a(pass.cpp.o)
      QtPass::connectPassSignalHandlers(Pass*) in libqtpasslib.a(qtpass.cpp.o)
  "Pass::finishedShow(QString const&)", referenced from:
      MainWindow::copyPasswordFromTreeview() in libqtpasslib.a(mainwindow.cpp.o)
      PasswordDialog::PasswordDialog(PasswordConfiguration const&, QWidget*) in libqtpasslib.a(passworddialog.cpp.o)
      PasswordDialog::PasswordDialog(QString const&, bool const&, QWidget*) in libqtpasslib.a(passworddialog.cpp.o)
      Pass::finished(int, int, QString const&, QString const&) in libqtpasslib.a(pass.cpp.o)
      QtPass::connectPassSignalHandlers(Pass*) in libqtpasslib.a(qtpass.cpp.o)
  "Pass::finishedInsert(QString const&, QString const&)", referenced from:
      Pass::finished(int, int, QString const&, QString const&) in libqtpasslib.a(pass.cpp.o)
      QtPass::connectPassSignalHandlers(Pass*) in libqtpasslib.a(qtpass.cpp.o)
  "Pass::finishedRemove(QString const&, QString const&)", referenced from:
      Pass::finished(int, int, QString const&, QString const&) in libqtpasslib.a(pass.cpp.o)
      QtPass::connectPassSignalHandlers(Pass*) in libqtpasslib.a(qtpass.cpp.o)
  "Pass::finishedGitInit(QString const&, QString const&)", referenced from:
      Pass::finished(int, int, QString const&, QString const&) in libqtpasslib.a(pass.cpp.o)
      QtPass::connectPassSignalHandlers(Pass*) in libqtpasslib.a(qtpass.cpp.o)
  "Pass::finishedGitPull(QString const&, QString const&)", referenced from:
      Pass::finished(int, int, QString const&, QString const&) in libqtpasslib.a(pass.cpp.o)
      QtPass::connectPassSignalHandlers(Pass*) in libqtpasslib.a(qtpass.cpp.o)
  "Pass::finishedGitPush(QString const&, QString const&)", referenced from:
      Pass::finished(int, int, QString const&, QString const&) in libqtpasslib.a(pass.cpp.o)
      QtPass::connectPassSignalHandlers(Pass*) in libqtpasslib.a(qtpass.cpp.o)
  "Pass::processErrorExit(int, QString const&)", referenced from:
      PasswordDialog::PasswordDialog(QString const&, bool const&, QWidget*) in libqtpasslib.a(passworddialog.cpp.o)
      Pass::finished(int, int, QString const&, QString const&) in libqtpasslib.a(pass.cpp.o)
      QtPass::connectPassSignalHandlers(Pass*) in libqtpasslib.a(qtpass.cpp.o)
  "Pass::staticMetaObject", referenced from:
      QMetaObject::Connection QObject::connect<void (Pass::*)(QString const&), void (MainWindow::*)(QString const&)>(QtPrivate::FunctionPointer<void (Pass::*)(QString const&)>::Object const*, void (Pass::*)(QString const&), QtPrivate::FunctionPointer<void (MainWindow::*)(QString const&)>::Object const*, void (MainWindow::*)(QString const&), Qt::ConnectionType) in libqtpasslib.a(mainwindow.cpp.o)
      QMetaObject::Connection QObject::connect<void (Pass::*)(QString const&), void (PasswordDialog::*)(QString const&)>(QtPrivate::FunctionPointer<void (Pass::*)(QString const&)>::Object const*, void (Pass::*)(QString const&), QtPrivate::FunctionPointer<void (PasswordDialog::*)(QString const&)>::Object const*, void (PasswordDialog::*)(QString const&), Qt::ConnectionType) in libqtpasslib.a(passworddialog.cpp.o)
      QMetaObject::Connection QObject::connect<void (Pass::*)(int, QString const&), bool (QWidget::*)()>(QtPrivate::FunctionPointer<void (Pass::*)(int, QString const&)>::Object const*, void (Pass::*)(int, QString const&), QtPrivate::FunctionPointer<bool (QWidget::*)()>::Object const*, bool (QWidget::*)(), Qt::ConnectionType) in libqtpasslib.a(passworddialog.cpp.o)
      Pass::tr(char const*, char const*, int) in libqtpasslib.a(pass.cpp.o)
      QMetaObject::Connection QObject::connect<void (Pass::*)(QProcess::ProcessError), void (QtPass::*)(QProcess::ProcessError)>(QtPrivate::FunctionPointer<void (Pass::*)(QProcess::ProcessError)>::Object const*, void (Pass::*)(QProcess::ProcessError), QtPrivate::FunctionPointer<void (QtPass::*)(QProcess::ProcessError)>::Object const*, void (QtPass::*)(QProcess::ProcessError), Qt::ConnectionType) in libqtpasslib.a(qtpass.cpp.o)
      QMetaObject::Connection QObject::connect<void (Pass::*)(int, QString const&), void (QtPass::*)(int, QString const&)>(QtPrivate::FunctionPointer<void (Pass::*)(int, QString const&)>::Object const*, void (Pass::*)(int, QString const&), QtPrivate::FunctionPointer<void (QtPass::*)(int, QString const&)>::Object const*, void (QtPass::*)(int, QString const&), Qt::ConnectionType) in libqtpasslib.a(qtpass.cpp.o)
      QMetaObject::Connection QObject::connect<void (Pass::*)(QString, QString), void (MainWindow::*)(QString, QString)>(QtPrivate::FunctionPointer<void (Pass::*)(QString, QString)>::Object const*, void (Pass::*)(QString, QString), QtPrivate::FunctionPointer<void (MainWindow::*)(QString, QString)>::Object const*, void (MainWindow::*)(QString, QString), Qt::ConnectionType) in libqtpasslib.a(qtpass.cpp.o)
      ...
  "Pass::finishedOtpGenerate(QString const&)", referenced from:
      Pass::finished(int, int, QString const&, QString const&) in libqtpasslib.a(pass.cpp.o)
      QtPass::connectPassSignalHandlers(Pass*) in libqtpasslib.a(qtpass.cpp.o)
  "Pass::startingExecuteWrapper()", referenced from:
      Pass::Pass() in libqtpasslib.a(pass.cpp.o)
      QtPass::connectPassSignalHandlers(Pass*) in libqtpasslib.a(qtpass.cpp.o)
  "Pass::finishedGenerateGPGKeys(QString const&, QString const&)", referenced from:
      QtPass::connectPassSignalHandlers(Pass*) in libqtpasslib.a(qtpass.cpp.o)
  "Pass::error(QProcess::ProcessError)", referenced from:
      QtPass::connectPassSignalHandlers(Pass*) in libqtpasslib.a(qtpass.cpp.o)
  "Pass::critical(QString, QString)", referenced from:
      Pass::Generate_b(unsigned int, QString const&) in libqtpasslib.a(pass.cpp.o)
      QtPass::connectPassSignalHandlers(Pass*) in libqtpasslib.a(qtpass.cpp.o)
      ImitatePass::Insert(QString, QString, bool) in libqtpasslib.a(imitatepass.cpp.o)
      ImitatePass::Init(QString, QList<UserInfo> const&) in libqtpasslib.a(imitatepass.cpp.o)
      ImitatePass::reencryptPath(QString const&) in libqtpasslib.a(imitatepass.cpp.o)
  "Pass::statusMsg(QString, int)", referenced from:
      QtPass::connectPassSignalHandlers(Pass*) in libqtpasslib.a(qtpass.cpp.o)
      ImitatePass::reencryptPath(QString const&) in libqtpasslib.a(imitatepass.cpp.o)
  "QtPass::staticMetaObject", referenced from:
      QtPass::tr(char const*, char const*, int) in libqtpasslib.a(qtpass.cpp.o)
  "Executor::staticMetaObject", referenced from:
      QMetaObject::Connection QObject::connect<void (Executor::*)(int, int, QString const&, QString const&), void (Pass::*)(int, int, QString const&, QString const&)>(QtPrivate::FunctionPointer<void (Executor::*)(int, int, QString const&, QString const&)>::Object const*, void (Executor::*)(int, int, QString const&, QString const&), QtPrivate::FunctionPointer<void (Pass::*)(int, int, QString const&, QString const&)>::Object const*, void (Pass::*)(int, int, QString const&, QString const&), Qt::ConnectionType) in libqtpasslib.a(pass.cpp.o)
      QMetaObject::Connection QObject::connect<void (Executor::*)(), void (Pass::*)()>(QtPrivate::FunctionPointer<void (Executor::*)()>::Object const*, void (Executor::*)(), QtPrivate::FunctionPointer<void (Pass::*)()>::Object const*, void (Pass::*)(), Qt::ConnectionType) in libqtpasslib.a(pass.cpp.o)
  "Executor::finished(int, int, QString const&, QString const&)", referenced from:
      Pass::Pass() in libqtpasslib.a(pass.cpp.o)
      Executor::finished(int, QProcess::ExitStatus) in libqtpasslib.a(executor.cpp.o)
  "Executor::starting()", referenced from:
      Pass::Pass() in libqtpasslib.a(pass.cpp.o)
      Executor::Executor(QObject*) in libqtpasslib.a(executor.cpp.o)
  "TrayIcon::staticMetaObject", referenced from:
      TrayIcon::tr(char const*, char const*, int) in libqtpasslib.a(trayicon.cpp.o)
  "Pass::metaObject() const", referenced from:
      vtable for RealPass in libqtpasslib.a(realpass.cpp.o)
  "typeinfo for Pass", referenced from:
      typeinfo for RealPass in libqtpasslib.a(realpass.cpp.o)
  "vtable for MainWindow", referenced from:
      MainWindow::MainWindow(QString const&, QWidget*) in libqtpasslib.a(mainwindow.cpp.o)
      MainWindow::~MainWindow() in libqtpasslib.a(mainwindow.cpp.o)
  NOTE: a missing vtable usually means the first non-inline virtual member function has no definition.
  "vtable for StoreModel", referenced from:
      StoreModel::~StoreModel() in libqtpasslib.a(mainwindow.cpp.o)
      StoreModel::StoreModel() in libqtpasslib.a(storemodel.cpp.o)
  NOTE: a missing vtable usually means the first non-inline virtual member function has no definition.
  "vtable for ImitatePass", referenced from:
      ImitatePass::ImitatePass() in libqtpasslib.a(imitatepass.cpp.o)
  NOTE: a missing vtable usually means the first non-inline virtual member function has no definition.
  "vtable for UsersDialog", referenced from:
      UsersDialog::UsersDialog(QString, QWidget*) in libqtpasslib.a(usersdialog.cpp.o)
      UsersDialog::~UsersDialog() in libqtpasslib.a(usersdialog.cpp.o)
  NOTE: a missing vtable usually means the first non-inline virtual member function has no definition.
  "vtable for ConfigDialog", referenced from:
      ConfigDialog::ConfigDialog(MainWindow*) in libqtpasslib.a(configdialog.cpp.o)
      ConfigDialog::~ConfigDialog() in libqtpasslib.a(configdialog.cpp.o)
  NOTE: a missing vtable usually means the first non-inline virtual member function has no definition.
  "vtable for KeygenDialog", referenced from:
      KeygenDialog::KeygenDialog(ConfigDialog*) in libqtpasslib.a(keygendialog.cpp.o)
      KeygenDialog::~KeygenDialog() in libqtpasslib.a(keygendialog.cpp.o)
  NOTE: a missing vtable usually means the first non-inline virtual member function has no definition.
  "vtable for PasswordDialog", referenced from:
      PasswordDialog::PasswordDialog(PasswordConfiguration const&, QWidget*) in libqtpasslib.a(passworddialog.cpp.o)
      PasswordDialog::PasswordDialog(QString const&, bool const&, QWidget*) in libqtpasslib.a(passworddialog.cpp.o)
      PasswordDialog::~PasswordDialog() in libqtpasslib.a(passworddialog.cpp.o)
  NOTE: a missing vtable usually means the first non-inline virtual member function has no definition.
  "vtable for QProgressIndicator", referenced from:
      QProgressIndicator::QProgressIndicator(QWidget*) in libqtpasslib.a(qprogressindicator.cpp.o)
  NOTE: a missing vtable usually means the first non-inline virtual member function has no definition.
  "vtable for QPushButtonAsQRCode", referenced from:
      QPushButtonAsQRCode::QPushButtonAsQRCode(QString const&, QWidget*) in libqtpasslib.a(qpushbuttonasqrcode.cpp.o)
  NOTE: a missing vtable usually means the first non-inline virtual member function has no definition.
  "vtable for DeselectableTreeView", referenced from:
      DeselectableTreeView::DeselectableTreeView(QWidget*) in libqtpasslib.a(mainwindow.cpp.o)
  NOTE: a missing vtable usually means the first non-inline virtual member function has no definition.
  "vtable for QPushButtonWithClipboard", referenced from:
      QPushButtonWithClipboard::QPushButtonWithClipboard(QString const&, QWidget*) in libqtpasslib.a(qpushbuttonwithclipboard.cpp.o)
  NOTE: a missing vtable usually means the first non-inline virtual member function has no definition.
  "vtable for Pass", referenced from:
      Pass::Pass() in libqtpasslib.a(pass.cpp.o)
      Pass::~Pass() in libqtpasslib.a(imitatepass.cpp.o)
      Pass::~Pass() in libqtpasslib.a(realpass.cpp.o)
  NOTE: a missing vtable usually means the first non-inline virtual member function has no definition.
  "vtable for QtPass", referenced from:
      QtPass::QtPass(MainWindow*) in libqtpasslib.a(qtpass.cpp.o)
      QtPass::~QtPass() in libqtpasslib.a(qtpass.cpp.o)
  NOTE: a missing vtable usually means the first non-inline virtual member function has no definition.
  "vtable for Executor", referenced from:
      Executor::~Executor() in libqtpasslib.a(pass.cpp.o)
      Executor::~Executor() in libqtpasslib.a(imitatepass.cpp.o)
      Executor::Executor(QObject*) in libqtpasslib.a(executor.cpp.o)
      Executor::~Executor() in libqtpasslib.a(realpass.cpp.o)
  NOTE: a missing vtable usually means the first non-inline virtual member function has no definition.
  "vtable for TrayIcon", referenced from:
      TrayIcon::TrayIcon(QMainWindow*) in libqtpasslib.a(trayicon.cpp.o)
  NOTE: a missing vtable usually means the first non-inline virtual member function has no definition.
ld: symbol(s) not found for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)
make[2]: *** [qtpass] Error 1
make[1]: *** [CMakeFiles/qtpass.dir/all] Error 2
make: *** [all] Error 2