mirror of https://github.com/Nheko-Reborn/nheko
parent
12ce7686ce
commit
6a7d28d1b5
@ -0,0 +1 @@ |
|||||||
|
github: itay-grudev |
@ -0,0 +1,56 @@ |
|||||||
|
name: "CI: Build Test" |
||||||
|
|
||||||
|
on: [push, pull_request] |
||||||
|
|
||||||
|
jobs: |
||||||
|
build: |
||||||
|
|
||||||
|
strategy: |
||||||
|
matrix: |
||||||
|
qt_version: [5.12.6, 5.13.2, 5.14.0, 5.15.0, 6.0.0] |
||||||
|
platform: [ubuntu-20.04, windows-latest, macos-latest] |
||||||
|
include: |
||||||
|
- qt_version: 6.0.0 |
||||||
|
additional_arguments: -D QT_DEFAULT_MAJOR_VERSION=6 |
||||||
|
- platform: ubuntu-20.04 |
||||||
|
CXXFLAGS: -Wall -Wextra -pedantic -Werror |
||||||
|
- platform: macos-latest |
||||||
|
CXXFLAGS: -Wall -Wextra -pedantic -Werror |
||||||
|
- platform: windows-latest |
||||||
|
CXXFLAGS: /W4 /WX |
||||||
|
|
||||||
|
runs-on: ${{ matrix.platform }} |
||||||
|
env: |
||||||
|
CXXFLAGS: ${{ matrix.CXXFLAGS }} |
||||||
|
|
||||||
|
steps: |
||||||
|
- uses: actions/checkout@v2.3.4 |
||||||
|
|
||||||
|
- name: Install Qt |
||||||
|
uses: jurplel/install-qt-action@v2.11.1 |
||||||
|
with: |
||||||
|
version: ${{ matrix.qt_version }} |
||||||
|
|
||||||
|
- name: cmake |
||||||
|
run: cmake . ${{ matrix.additional_arguments }} |
||||||
|
|
||||||
|
- name: cmake build |
||||||
|
run: cmake --build . |
||||||
|
|
||||||
|
- name: Build example - basic (cmake) |
||||||
|
working-directory: examples/basic/ |
||||||
|
run: | |
||||||
|
cmake . ${{ matrix.additional_arguments }} |
||||||
|
cmake --build . |
||||||
|
|
||||||
|
- name: Build example - calculator (cmake) |
||||||
|
working-directory: examples/calculator/ |
||||||
|
run: | |
||||||
|
cmake . ${{ matrix.additional_arguments }} |
||||||
|
cmake --build . |
||||||
|
|
||||||
|
- name: Build example - sending_arguments (cmake) |
||||||
|
working-directory: examples/sending_arguments/ |
||||||
|
run: | |
||||||
|
cmake . ${{ matrix.additional_arguments }} |
||||||
|
cmake --build . |
@ -0,0 +1,12 @@ |
|||||||
|
cmake_minimum_required(VERSION 3.7.0) |
||||||
|
|
||||||
|
project(basic LANGUAGES CXX) |
||||||
|
|
||||||
|
# SingleApplication base class |
||||||
|
set(QAPPLICATION_CLASS QCoreApplication) |
||||||
|
add_subdirectory(../.. SingleApplication) |
||||||
|
|
||||||
|
add_executable(basic main.cpp) |
||||||
|
|
||||||
|
target_link_libraries(${PROJECT_NAME} SingleApplication::SingleApplication) |
||||||
|
|
@ -0,0 +1,5 @@ |
|||||||
|
# Single Application implementation |
||||||
|
include(../../singleapplication.pri) |
||||||
|
DEFINES += QAPPLICATION_CLASS=QCoreApplication |
||||||
|
|
||||||
|
SOURCES += main.cpp |
@ -0,0 +1,10 @@ |
|||||||
|
#include <singleapplication.h> |
||||||
|
|
||||||
|
int main(int argc, char *argv[]) |
||||||
|
{ |
||||||
|
SingleApplication app( argc, argv ); |
||||||
|
|
||||||
|
qWarning() << "Started a new instance"; |
||||||
|
|
||||||
|
return app.exec(); |
||||||
|
} |
@ -0,0 +1,21 @@ |
|||||||
|
cmake_minimum_required(VERSION 3.7.0) |
||||||
|
|
||||||
|
project(calculator LANGUAGES CXX) |
||||||
|
|
||||||
|
set(CMAKE_AUTOMOC ON) |
||||||
|
|
||||||
|
# SingleApplication base class |
||||||
|
set(QAPPLICATION_CLASS QApplication) |
||||||
|
add_subdirectory(../.. SingleApplication) |
||||||
|
|
||||||
|
find_package(Qt${QT_DEFAULT_MAJOR_VERSION} COMPONENTS Core REQUIRED) |
||||||
|
|
||||||
|
add_executable(${PROJECT_NAME} |
||||||
|
button.h |
||||||
|
calculator.h |
||||||
|
button.cpp |
||||||
|
calculator.cpp |
||||||
|
main.cpp |
||||||
|
) |
||||||
|
|
||||||
|
target_link_libraries(${PROJECT_NAME} SingleApplication::SingleApplication) |
@ -0,0 +1,73 @@ |
|||||||
|
/****************************************************************************
|
||||||
|
** |
||||||
|
** Copyright (C) 2016 The Qt Company Ltd. |
||||||
|
** Contact: https://www.qt.io/licensing/
|
||||||
|
** |
||||||
|
** This file is part of the examples of the Qt Toolkit. |
||||||
|
** |
||||||
|
** $QT_BEGIN_LICENSE:BSD$ |
||||||
|
** Commercial License Usage |
||||||
|
** Licensees holding valid commercial Qt licenses may use this file in |
||||||
|
** accordance with the commercial license agreement provided with the |
||||||
|
** Software or, alternatively, in accordance with the terms contained in |
||||||
|
** a written agreement between you and The Qt Company. For licensing terms |
||||||
|
** and conditions see https://www.qt.io/terms-conditions. For further
|
||||||
|
** information use the contact form at https://www.qt.io/contact-us.
|
||||||
|
** |
||||||
|
** BSD License Usage |
||||||
|
** Alternatively, you may use this file under the terms of the BSD license |
||||||
|
** as follows: |
||||||
|
** |
||||||
|
** "Redistribution and use in source and binary forms, with or without |
||||||
|
** modification, are permitted provided that the following conditions are |
||||||
|
** met: |
||||||
|
** * Redistributions of source code must retain the above copyright |
||||||
|
** notice, this list of conditions and the following disclaimer. |
||||||
|
** * Redistributions in binary form must reproduce the above copyright |
||||||
|
** notice, this list of conditions and the following disclaimer in |
||||||
|
** the documentation and/or other materials provided with the |
||||||
|
** distribution. |
||||||
|
** * Neither the name of The Qt Company Ltd nor the names of its |
||||||
|
** contributors may be used to endorse or promote products derived |
||||||
|
** from this software without specific prior written permission. |
||||||
|
** |
||||||
|
** |
||||||
|
** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS |
||||||
|
** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT |
||||||
|
** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR |
||||||
|
** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT |
||||||
|
** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, |
||||||
|
** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT |
||||||
|
** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
||||||
|
** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
||||||
|
** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
||||||
|
** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE |
||||||
|
** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." |
||||||
|
** |
||||||
|
** $QT_END_LICENSE$ |
||||||
|
** |
||||||
|
****************************************************************************/ |
||||||
|
|
||||||
|
#include <QtWidgets> |
||||||
|
|
||||||
|
#include "button.h" |
||||||
|
|
||||||
|
//! [0]
|
||||||
|
Button::Button(const QString &text, QWidget *parent) |
||||||
|
: QToolButton(parent) |
||||||
|
{ |
||||||
|
setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Preferred); |
||||||
|
setText(text); |
||||||
|
} |
||||||
|
//! [0]
|
||||||
|
|
||||||
|
//! [1]
|
||||||
|
QSize Button::sizeHint() const |
||||||
|
//! [1] //! [2]
|
||||||
|
{ |
||||||
|
QSize size = QToolButton::sizeHint(); |
||||||
|
size.rheight() += 20; |
||||||
|
size.rwidth() = qMax(size.width(), size.height()); |
||||||
|
return size; |
||||||
|
} |
||||||
|
//! [2]
|
@ -0,0 +1,68 @@ |
|||||||
|
/****************************************************************************
|
||||||
|
** |
||||||
|
** Copyright (C) 2016 The Qt Company Ltd. |
||||||
|
** Contact: https://www.qt.io/licensing/
|
||||||
|
** |
||||||
|
** This file is part of the examples of the Qt Toolkit. |
||||||
|
** |
||||||
|
** $QT_BEGIN_LICENSE:BSD$ |
||||||
|
** Commercial License Usage |
||||||
|
** Licensees holding valid commercial Qt licenses may use this file in |
||||||
|
** accordance with the commercial license agreement provided with the |
||||||
|
** Software or, alternatively, in accordance with the terms contained in |
||||||
|
** a written agreement between you and The Qt Company. For licensing terms |
||||||
|
** and conditions see https://www.qt.io/terms-conditions. For further
|
||||||
|
** information use the contact form at https://www.qt.io/contact-us.
|
||||||
|
** |
||||||
|
** BSD License Usage |
||||||
|
** Alternatively, you may use this file under the terms of the BSD license |
||||||
|
** as follows: |
||||||
|
** |
||||||
|
** "Redistribution and use in source and binary forms, with or without |
||||||
|
** modification, are permitted provided that the following conditions are |
||||||
|
** met: |
||||||
|
** * Redistributions of source code must retain the above copyright |
||||||
|
** notice, this list of conditions and the following disclaimer. |
||||||
|
** * Redistributions in binary form must reproduce the above copyright |
||||||
|
** notice, this list of conditions and the following disclaimer in |
||||||
|
** the documentation and/or other materials provided with the |
||||||
|
** distribution. |
||||||
|
** * Neither the name of The Qt Company Ltd nor the names of its |
||||||
|
** contributors may be used to endorse or promote products derived |
||||||
|
** from this software without specific prior written permission. |
||||||
|
** |
||||||
|
** |
||||||
|
** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS |
||||||
|
** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT |
||||||
|
** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR |
||||||
|
** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT |
||||||
|
** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, |
||||||
|
** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT |
||||||
|
** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
||||||
|
** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
||||||
|
** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
||||||
|
** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE |
||||||
|
** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." |
||||||
|
** |
||||||
|
** $QT_END_LICENSE$ |
||||||
|
** |
||||||
|
****************************************************************************/ |
||||||
|
|
||||||
|
#ifndef BUTTON_H |
||||||
|
#define BUTTON_H |
||||||
|
|
||||||
|
#include <QToolButton> |
||||||
|
|
||||||
|
//! [0]
|
||||||
|
class Button : public QToolButton |
||||||
|
{ |
||||||
|
Q_OBJECT |
||||||
|
|
||||||
|
public: |
||||||
|
explicit Button(const QString &text, QWidget *parent = 0); |
||||||
|
|
||||||
|
QSize sizeHint() const Q_DECL_OVERRIDE; |
||||||
|
}; |
||||||
|
//! [0]
|
||||||
|
|
||||||
|
#endif |
@ -0,0 +1,406 @@ |
|||||||
|
/****************************************************************************
|
||||||
|
** |
||||||
|
** Copyright (C) 2016 The Qt Company Ltd. |
||||||
|
** Contact: https://www.qt.io/licensing/
|
||||||
|
** |
||||||
|
** This file is part of the examples of the Qt Toolkit. |
||||||
|
** |
||||||
|
** $QT_BEGIN_LICENSE:BSD$ |
||||||
|
** Commercial License Usage |
||||||
|
** Licensees holding valid commercial Qt licenses may use this file in |
||||||
|
** accordance with the commercial license agreement provided with the |
||||||
|
** Software or, alternatively, in accordance with the terms contained in |
||||||
|
** a written agreement between you and The Qt Company. For licensing terms |
||||||
|
** and conditions see https://www.qt.io/terms-conditions. For further
|
||||||
|
** information use the contact form at https://www.qt.io/contact-us.
|
||||||
|
** |
||||||
|
** BSD License Usage |
||||||
|
** Alternatively, you may use this file under the terms of the BSD license |
||||||
|
** as follows: |
||||||
|
** |
||||||
|
** "Redistribution and use in source and binary forms, with or without |
||||||
|
** modification, are permitted provided that the following conditions are |
||||||
|
** met: |
||||||
|
** * Redistributions of source code must retain the above copyright |
||||||
|
** notice, this list of conditions and the following disclaimer. |
||||||
|
** * Redistributions in binary form must reproduce the above copyright |
||||||
|
** notice, this list of conditions and the following disclaimer in |
||||||
|
** the documentation and/or other materials provided with the |
||||||
|
** distribution. |
||||||
|
** * Neither the name of The Qt Company Ltd nor the names of its |
||||||
|
** contributors may be used to endorse or promote products derived |
||||||
|
** from this software without specific prior written permission. |
||||||
|
** |
||||||
|
** |
||||||
|
** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS |
||||||
|
** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT |
||||||
|
** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR |
||||||
|
** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT |
||||||
|
** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, |
||||||
|
** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT |
||||||
|
** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
||||||
|
** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
||||||
|
** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
||||||
|
** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE |
||||||
|
** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." |
||||||
|
** |
||||||
|
** $QT_END_LICENSE$ |
||||||
|
** |
||||||
|
****************************************************************************/ |
||||||
|
|
||||||
|
#include <QtWidgets> |
||||||
|
|
||||||
|
#include <cmath> |
||||||
|
|
||||||
|
#include "button.h" |
||||||
|
#include "calculator.h" |
||||||
|
|
||||||
|
//! [0]
|
||||||
|
Calculator::Calculator(QWidget *parent) |
||||||
|
: QWidget(parent) |
||||||
|
{ |
||||||
|
sumInMemory = 0.0; |
||||||
|
sumSoFar = 0.0; |
||||||
|
factorSoFar = 0.0; |
||||||
|
waitingForOperand = true; |
||||||
|
//! [0]
|
||||||
|
|
||||||
|
//! [1]
|
||||||
|
display = new QLineEdit("0"); |
||||||
|
//! [1] //! [2]
|
||||||
|
display->setReadOnly(true); |
||||||
|
display->setAlignment(Qt::AlignRight); |
||||||
|
display->setMaxLength(15); |
||||||
|
|
||||||
|
QFont font = display->font(); |
||||||
|
font.setPointSize(font.pointSize() + 8); |
||||||
|
display->setFont(font); |
||||||
|
//! [2]
|
||||||
|
|
||||||
|
//! [4]
|
||||||
|
for (int i = 0; i < NumDigitButtons; ++i) { |
||||||
|
digitButtons[i] = createButton(QString::number(i), SLOT(digitClicked())); |
||||||
|
} |
||||||
|
|
||||||
|
Button *pointButton = createButton(".", SLOT(pointClicked())); |
||||||
|
Button *changeSignButton = createButton("\302\261", SLOT(changeSignClicked())); |
||||||
|
|
||||||
|
Button *backspaceButton = createButton("Backspace", SLOT(backspaceClicked())); |
||||||
|
Button *clearButton = createButton("Clear", SLOT(clear())); |
||||||
|
Button *clearAllButton = createButton("Clear All", SLOT(clearAll())); |
||||||
|
|
||||||
|
Button *clearMemoryButton = createButton("MC", SLOT(clearMemory())); |
||||||
|
Button *readMemoryButton = createButton("MR", SLOT(readMemory())); |
||||||
|
Button *setMemoryButton = createButton("MS", SLOT(setMemory())); |
||||||
|
Button *addToMemoryButton = createButton("M+", SLOT(addToMemory())); |
||||||
|
|
||||||
|
Button *divisionButton = createButton("\303\267", SLOT(multiplicativeOperatorClicked())); |
||||||
|
Button *timesButton = createButton("\303\227", SLOT(multiplicativeOperatorClicked())); |
||||||
|
Button *minusButton = createButton("-", SLOT(additiveOperatorClicked())); |
||||||
|
Button *plusButton = createButton("+", SLOT(additiveOperatorClicked())); |
||||||
|
|
||||||
|
Button *squareRootButton = createButton("Sqrt", SLOT(unaryOperatorClicked())); |
||||||
|
Button *powerButton = createButton("x\302\262", SLOT(unaryOperatorClicked())); |
||||||
|
Button *reciprocalButton = createButton("1/x", SLOT(unaryOperatorClicked())); |
||||||
|
Button *equalButton = createButton("=", SLOT(equalClicked())); |
||||||
|
//! [4]
|
||||||
|
|
||||||
|
//! [5]
|
||||||
|
QGridLayout *mainLayout = new QGridLayout; |
||||||
|
//! [5] //! [6]
|
||||||
|
mainLayout->setSizeConstraint(QLayout::SetFixedSize); |
||||||
|
mainLayout->addWidget(display, 0, 0, 1, 6); |
||||||
|
mainLayout->addWidget(backspaceButton, 1, 0, 1, 2); |
||||||
|
mainLayout->addWidget(clearButton, 1, 2, 1, 2); |
||||||
|
mainLayout->addWidget(clearAllButton, 1, 4, 1, 2); |
||||||
|
|
||||||
|
mainLayout->addWidget(clearMemoryButton, 2, 0); |
||||||
|
mainLayout->addWidget(readMemoryButton, 3, 0); |
||||||
|
mainLayout->addWidget(setMemoryButton, 4, 0); |
||||||
|
mainLayout->addWidget(addToMemoryButton, 5, 0); |
||||||
|
|
||||||
|
for (int i = 1; i < NumDigitButtons; ++i) { |
||||||
|
int row = ((9 - i) / 3) + 2; |
||||||
|
int column = ((i - 1) % 3) + 1; |
||||||
|
mainLayout->addWidget(digitButtons[i], row, column); |
||||||
|
} |
||||||
|
|
||||||
|
mainLayout->addWidget(digitButtons[0], 5, 1); |
||||||
|
mainLayout->addWidget(pointButton, 5, 2); |
||||||
|
mainLayout->addWidget(changeSignButton, 5, 3); |
||||||
|
|
||||||
|
mainLayout->addWidget(divisionButton, 2, 4); |
||||||
|
mainLayout->addWidget(timesButton, 3, 4); |
||||||
|
mainLayout->addWidget(minusButton, 4, 4); |
||||||
|
mainLayout->addWidget(plusButton, 5, 4); |
||||||
|
|
||||||
|
mainLayout->addWidget(squareRootButton, 2, 5); |
||||||
|
mainLayout->addWidget(powerButton, 3, 5); |
||||||
|
mainLayout->addWidget(reciprocalButton, 4, 5); |
||||||
|
mainLayout->addWidget(equalButton, 5, 5); |
||||||
|
setLayout(mainLayout); |
||||||
|
|
||||||
|
setWindowTitle("Calculator"); |
||||||
|
} |
||||||
|
//! [6]
|
||||||
|
|
||||||
|
//! [7]
|
||||||
|
void Calculator::digitClicked() |
||||||
|
{ |
||||||
|
Button *clickedButton = qobject_cast<Button *>(sender()); |
||||||
|
int digitValue = clickedButton->text().toInt(); |
||||||
|
if (display->text() == "0" && digitValue == 0.0) |
||||||
|
return; |
||||||
|
|
||||||
|
if (waitingForOperand) { |
||||||
|
display->clear(); |
||||||
|
waitingForOperand = false; |
||||||
|
} |
||||||
|
display->setText(display->text() + QString::number(digitValue)); |
||||||
|
} |
||||||
|
//! [7]
|
||||||
|
|
||||||
|
//! [8]
|
||||||
|
void Calculator::unaryOperatorClicked() |
||||||
|
//! [8] //! [9]
|
||||||
|
{ |
||||||
|
Button *clickedButton = qobject_cast<Button *>(sender()); |
||||||
|
QString clickedOperator = clickedButton->text(); |
||||||
|
double operand = display->text().toDouble(); |
||||||
|
double result = 0.0; |
||||||
|
|
||||||
|
if (clickedOperator == "Sqrt") { |
||||||
|
if (operand < 0.0) { |
||||||
|
abortOperation(); |
||||||
|
return; |
||||||
|
} |
||||||
|
result = std::sqrt(operand); |
||||||
|
} else if (clickedOperator == "x\302\262") { |
||||||
|
result = std::pow(operand, 2.0); |
||||||
|
} else if (clickedOperator == "1/x") { |
||||||
|
if (operand == 0.0) { |
||||||
|
abortOperation(); |
||||||
|
return; |
||||||
|
} |
||||||
|
result = 1.0 / operand; |
||||||
|
} |
||||||
|
display->setText(QString::number(result)); |
||||||
|
waitingForOperand = true; |
||||||
|
} |
||||||
|
//! [9]
|
||||||
|
|
||||||
|
//! [10]
|
||||||
|
void Calculator::additiveOperatorClicked() |
||||||
|
//! [10] //! [11]
|
||||||
|
{ |
||||||
|
Button *clickedButton = qobject_cast<Button *>(sender()); |
||||||
|
QString clickedOperator = clickedButton->text(); |
||||||
|
double operand = display->text().toDouble(); |
||||||
|
|
||||||
|
//! [11] //! [12]
|
||||||
|
if (!pendingMultiplicativeOperator.isEmpty()) { |
||||||
|
//! [12] //! [13]
|
||||||
|
if (!calculate(operand, pendingMultiplicativeOperator)) { |
||||||
|
abortOperation(); |
||||||
|
return; |
||||||
|
} |
||||||
|
display->setText(QString::number(factorSoFar)); |
||||||
|
operand = factorSoFar; |
||||||
|
factorSoFar = 0.0; |
||||||
|
pendingMultiplicativeOperator.clear(); |
||||||
|
} |
||||||
|
|
||||||
|
//! [13] //! [14]
|
||||||
|
if (!pendingAdditiveOperator.isEmpty()) { |
||||||
|
//! [14] //! [15]
|
||||||
|
if (!calculate(operand, pendingAdditiveOperator)) { |
||||||
|
abortOperation(); |
||||||
|
return; |
||||||
|
} |
||||||
|
display->setText(QString::number(sumSoFar)); |
||||||
|
} else { |
||||||
|
sumSoFar = operand; |
||||||
|
} |
||||||
|
|
||||||
|
//! [15] //! [16]
|
||||||
|
pendingAdditiveOperator = clickedOperator; |
||||||
|
//! [16] //! [17]
|
||||||
|
waitingForOperand = true; |
||||||
|
} |
||||||
|
//! [17]
|
||||||
|
|
||||||
|
//! [18]
|
||||||
|
void Calculator::multiplicativeOperatorClicked() |
||||||
|
{ |
||||||
|
Button *clickedButton = qobject_cast<Button *>(sender()); |
||||||
|
QString clickedOperator = clickedButton->text(); |
||||||
|
double operand = display->text().toDouble(); |
||||||
|
|
||||||
|
if (!pendingMultiplicativeOperator.isEmpty()) { |
||||||
|
if (!calculate(operand, pendingMultiplicativeOperator)) { |
||||||
|
abortOperation(); |
||||||
|
return; |
||||||
|
} |
||||||
|
display->setText(QString::number(factorSoFar)); |
||||||
|
} else { |
||||||
|
factorSoFar = operand; |
||||||
|
} |
||||||
|
|
||||||
|
pendingMultiplicativeOperator = clickedOperator; |
||||||
|
waitingForOperand = true; |
||||||
|
} |
||||||
|
//! [18]
|
||||||
|
|
||||||
|
//! [20]
|
||||||
|
void Calculator::equalClicked() |
||||||
|
{ |
||||||
|
double operand = display->text().toDouble(); |
||||||
|
|
||||||
|
if (!pendingMultiplicativeOperator.isEmpty()) { |
||||||
|
if (!calculate(operand, pendingMultiplicativeOperator)) { |
||||||
|
abortOperation(); |
||||||
|
return; |
||||||
|
} |
||||||
|
operand = factorSoFar; |
||||||
|
factorSoFar = 0.0; |
||||||
|
pendingMultiplicativeOperator.clear(); |
||||||
|
} |
||||||
|
if (!pendingAdditiveOperator.isEmpty()) { |
||||||
|
if (!calculate(operand, pendingAdditiveOperator)) { |
||||||
|
abortOperation(); |
||||||
|
return; |
||||||
|
} |
||||||
|
pendingAdditiveOperator.clear(); |
||||||
|
} else { |
||||||
|
sumSoFar = operand; |
||||||
|
} |
||||||
|
|
||||||
|
display->setText(QString::number(sumSoFar)); |
||||||
|
sumSoFar = 0.0; |
||||||
|
waitingForOperand = true; |
||||||
|
} |
||||||
|
//! [20]
|
||||||
|
|
||||||
|
//! [22]
|
||||||
|
void Calculator::pointClicked() |
||||||
|
{ |
||||||
|
if (waitingForOperand) |
||||||
|
display->setText("0"); |
||||||
|
if (!display->text().contains('.')) |
||||||
|
display->setText(display->text() + "."); |
||||||
|
waitingForOperand = false; |
||||||
|
} |
||||||
|
//! [22]
|
||||||
|
|
||||||
|
//! [24]
|
||||||
|
void Calculator::changeSignClicked() |
||||||
|
{ |
||||||
|
QString text = display->text(); |
||||||
|
double value = text.toDouble(); |
||||||
|
|
||||||
|
if (value > 0.0) { |
||||||
|
text.prepend("-"); |
||||||
|
} else if (value < 0.0) { |
||||||
|
text.remove(0, 1); |
||||||
|
} |
||||||
|
display->setText(text); |
||||||
|
} |
||||||
|
//! [24]
|
||||||
|
|
||||||
|
//! [26]
|
||||||
|
void Calculator::backspaceClicked() |
||||||
|
{ |
||||||
|
if (waitingForOperand) |
||||||
|
return; |
||||||
|
|
||||||
|
QString text = display->text(); |
||||||
|
text.chop(1); |
||||||
|
if (text.isEmpty()) { |
||||||
|
text = "0"; |
||||||
|
waitingForOperand = true; |
||||||
|
} |
||||||
|
display->setText(text); |
||||||
|
} |
||||||
|
//! [26]
|
||||||
|
|
||||||
|
//! [28]
|
||||||
|
void Calculator::clear() |
||||||
|
{ |
||||||
|
if (waitingForOperand) |
||||||
|
return; |
||||||
|
|
||||||
|
display->setText("0"); |
||||||
|
waitingForOperand = true; |
||||||
|
} |
||||||
|
//! [28]
|
||||||
|
|
||||||
|
//! [30]
|
||||||
|
void Calculator::clearAll() |
||||||
|
{ |
||||||
|
sumSoFar = 0.0; |
||||||
|
factorSoFar = 0.0; |
||||||
|
pendingAdditiveOperator.clear(); |
||||||
|
pendingMultiplicativeOperator.clear(); |
||||||
|
display->setText("0"); |
||||||
|
waitingForOperand = true; |
||||||
|
} |
||||||
|
//! [30]
|
||||||
|
|
||||||
|
//! [32]
|
||||||
|
void Calculator::clearMemory() |
||||||
|
{ |
||||||
|
sumInMemory = 0.0; |
||||||
|
} |
||||||
|
|
||||||
|
void Calculator::readMemory() |
||||||
|
{ |
||||||
|
display->setText(QString::number(sumInMemory)); |
||||||
|
waitingForOperand = true; |
||||||
|
} |
||||||
|
|
||||||
|
void Calculator::setMemory() |
||||||
|
{ |
||||||
|
equalClicked(); |
||||||
|
sumInMemory = display->text().toDouble(); |
||||||
|
} |
||||||
|
|
||||||
|
void Calculator::addToMemory() |
||||||
|
{ |
||||||
|
equalClicked(); |
||||||
|
sumInMemory += display->text().toDouble(); |
||||||
|
} |
||||||
|
//! [32]
|
||||||
|
//! [34]
|
||||||
|
Button *Calculator::createButton(const QString &text, const char *member) |
||||||
|
{ |
||||||
|
Button *button = new Button(text); |
||||||
|
connect(button, SIGNAL(clicked()), this, member); |
||||||
|
return button; |
||||||
|
} |
||||||
|
//! [34]
|
||||||
|
|
||||||
|
//! [36]
|
||||||
|
void Calculator::abortOperation() |
||||||
|
{ |
||||||
|
clearAll(); |
||||||
|
display->setText("####"); |
||||||
|
} |
||||||
|
//! [36]
|
||||||
|
|
||||||
|
//! [38]
|
||||||
|
bool Calculator::calculate(double rightOperand, const QString &pendingOperator) |
||||||
|
{ |
||||||
|
if (pendingOperator == "+") { |
||||||
|
sumSoFar += rightOperand; |
||||||
|
} else if (pendingOperator == "-") { |
||||||
|
sumSoFar -= rightOperand; |
||||||
|
} else if (pendingOperator == "\303\227") { |
||||||
|
factorSoFar *= rightOperand; |
||||||
|
} else if (pendingOperator == "\303\267") { |
||||||
|
if (rightOperand == 0.0) |
||||||
|
return false; |
||||||
|
factorSoFar /= rightOperand; |
||||||
|
} |
||||||
|
return true; |
||||||
|
} |
||||||
|
//! [38]
|
@ -0,0 +1,117 @@ |
|||||||
|
/****************************************************************************
|
||||||
|
** |
||||||
|
** Copyright (C) 2016 The Qt Company Ltd. |
||||||
|
** Contact: https://www.qt.io/licensing/
|
||||||
|
** |
||||||
|
** This file is part of the examples of the Qt Toolkit. |
||||||
|
** |
||||||
|
** $QT_BEGIN_LICENSE:BSD$ |
||||||
|
** Commercial License Usage |
||||||
|
** Licensees holding valid commercial Qt licenses may use this file in |
||||||
|
** accordance with the commercial license agreement provided with the |
||||||
|
** Software or, alternatively, in accordance with the terms contained in |
||||||
|
** a written agreement between you and The Qt Company. For licensing terms |
||||||
|
** and conditions see https://www.qt.io/terms-conditions. For further
|
||||||
|
** information use the contact form at https://www.qt.io/contact-us.
|
||||||
|
** |
||||||
|
** BSD License Usage |
||||||
|
** Alternatively, you may use this file under the terms of the BSD license |
||||||
|
** as follows: |
||||||
|
** |
||||||
|
** "Redistribution and use in source and binary forms, with or without |
||||||
|
** modification, are permitted provided that the following conditions are |
||||||
|
** met: |
||||||
|
** * Redistributions of source code must retain the above copyright |
||||||
|
** notice, this list of conditions and the following disclaimer. |
||||||
|
** * Redistributions in binary form must reproduce the above copyright |
||||||
|
** notice, this list of conditions and the following disclaimer in |
||||||
|
** the documentation and/or other materials provided with the |
||||||
|
** distribution. |
||||||
|
** * Neither the name of The Qt Company Ltd nor the names of its |
||||||
|
** contributors may be used to endorse or promote products derived |
||||||
|
** from this software without specific prior written permission. |
||||||
|
** |
||||||
|
** |
||||||
|
** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS |
||||||
|
** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT |
||||||
|
** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR |
||||||
|
** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT |
||||||
|
** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, |
||||||
|
** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT |
||||||
|
** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
||||||
|
** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
||||||
|
** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
||||||
|
** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE |
||||||
|
** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." |
||||||
|
** |
||||||
|
** $QT_END_LICENSE$ |
||||||
|
** |
||||||
|
****************************************************************************/ |
||||||
|
|
||||||
|
#ifndef CALCULATOR_H |
||||||
|
#define CALCULATOR_H |
||||||
|
|
||||||
|
#include <QWidget> |
||||||
|
|
||||||
|
QT_BEGIN_NAMESPACE |
||||||
|
class QLineEdit; |
||||||
|
QT_END_NAMESPACE |
||||||
|
class Button; |
||||||
|
|
||||||
|
//! [0]
|
||||||
|
class Calculator : public QWidget |
||||||
|
{ |
||||||
|
Q_OBJECT |
||||||
|
|
||||||
|
public: |
||||||
|
Calculator(QWidget *parent = 0); |
||||||
|
|
||||||
|
private slots: |
||||||
|
void digitClicked(); |
||||||
|
void unaryOperatorClicked(); |
||||||
|
void additiveOperatorClicked(); |
||||||
|
void multiplicativeOperatorClicked(); |
||||||
|
void equalClicked(); |
||||||
|
void pointClicked(); |
||||||
|
void changeSignClicked(); |
||||||
|
void backspaceClicked(); |
||||||
|
void clear(); |
||||||
|
void clearAll(); |
||||||
|
void clearMemory(); |
||||||
|
void readMemory(); |
||||||
|
void setMemory(); |
||||||
|
void addToMemory(); |
||||||
|
//! [0]
|
||||||
|
|
||||||
|
//! [1]
|
||||||
|
private: |
||||||
|
//! [1] //! [2]
|
||||||
|
Button *createButton(const QString &text, const char *member); |
||||||
|
void abortOperation(); |
||||||
|
bool calculate(double rightOperand, const QString &pendingOperator); |
||||||
|
//! [2]
|
||||||
|
|
||||||
|
//! [3]
|
||||||
|
double sumInMemory; |
||||||
|
//! [3] //! [4]
|
||||||
|
double sumSoFar; |
||||||
|
//! [4] //! [5]
|
||||||
|
double factorSoFar; |
||||||
|
//! [5] //! [6]
|
||||||
|
QString pendingAdditiveOperator; |
||||||
|
//! [6] //! [7]
|
||||||
|
QString pendingMultiplicativeOperator; |
||||||
|
//! [7] //! [8]
|
||||||
|
bool waitingForOperand; |
||||||
|
//! [8]
|
||||||
|
|
||||||
|
//! [9]
|
||||||
|
QLineEdit *display; |
||||||
|
//! [9] //! [10]
|
||||||
|
|
||||||
|
enum { NumDigitButtons = 10 }; |
||||||
|
Button *digitButtons[NumDigitButtons]; |
||||||
|
}; |
||||||
|
//! [10]
|
||||||
|
|
||||||
|
#endif |
@ -0,0 +1,11 @@ |
|||||||
|
QT += widgets |
||||||
|
|
||||||
|
HEADERS = button.h \ |
||||||
|
calculator.h |
||||||
|
SOURCES = button.cpp \ |
||||||
|
calculator.cpp \ |
||||||
|
main.cpp |
||||||
|
|
||||||
|
# Single Application implementation |
||||||
|
include(../../singleapplication.pri) |
||||||
|
DEFINES += QAPPLICATION_CLASS=QApplication |
@ -0,0 +1,71 @@ |
|||||||
|
/****************************************************************************
|
||||||
|
** |
||||||
|
** Copyright (C) 2016 The Qt Company Ltd. |
||||||
|
** Contact: https://www.qt.io/licensing/
|
||||||
|
** |
||||||
|
** This file is part of the examples of the Qt Toolkit. |
||||||
|
** |
||||||
|
** $QT_BEGIN_LICENSE:BSD$ |
||||||
|
** Commercial License Usage |
||||||
|
** Licensees holding valid commercial Qt licenses may use this file in |
||||||
|
** accordance with the commercial license agreement provided with the |
||||||
|
** Software or, alternatively, in accordance with the terms contained in |
||||||
|
** a written agreement between you and The Qt Company. For licensing terms |
||||||
|
** and conditions see https://www.qt.io/terms-conditions. For further
|
||||||
|
** information use the contact form at https://www.qt.io/contact-us.
|
||||||
|
** |
||||||
|
** BSD License Usage |
||||||
|
** Alternatively, you may use this file under the terms of the BSD license |
||||||
|
** as follows: |
||||||
|
** |
||||||
|
** "Redistribution and use in source and binary forms, with or without |
||||||
|
** modification, are permitted provided that the following conditions are |
||||||
|
** met: |
||||||
|
** * Redistributions of source code must retain the above copyright |
||||||
|
** notice, this list of conditions and the following disclaimer. |
||||||
|
** * Redistributions in binary form must reproduce the above copyright |
||||||
|
** notice, this list of conditions and the following disclaimer in |
||||||
|
** the documentation and/or other materials provided with the |
||||||
|
** distribution. |
||||||
|
** * Neither the name of The Qt Company Ltd nor the names of its |
||||||
|
** contributors may be used to endorse or promote products derived |
||||||
|
** from this software without specific prior written permission. |
||||||
|
** |
||||||
|
** |
||||||
|
** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS |
||||||
|
** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT |
||||||
|
** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR |
||||||
|
** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT |
||||||
|
** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, |
||||||
|
** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT |
||||||
|
** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
||||||
|
** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
||||||
|
** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
||||||
|
** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE |
||||||
|
** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." |
||||||
|
** |
||||||
|
** $QT_END_LICENSE$ |
||||||
|
** |
||||||
|
****************************************************************************/ |
||||||
|
|
||||||
|
#include <QApplication> |
||||||
|
|
||||||
|
#include <singleapplication.h> |
||||||
|
|
||||||
|
#include "calculator.h" |
||||||
|
|
||||||
|
int main(int argc, char *argv[]) |
||||||
|
{ |
||||||
|
SingleApplication app(argc, argv); |
||||||
|
|
||||||
|
Calculator calc; |
||||||
|
|
||||||
|
QObject::connect( &app, &SingleApplication::instanceStarted, [ &calc ]() { |
||||||
|
calc.raise(); |
||||||
|
calc.activateWindow(); |
||||||
|
}); |
||||||
|
|
||||||
|
calc.show(); |
||||||
|
|
||||||
|
return app.exec(); |
||||||
|
} |
@ -0,0 +1,20 @@ |
|||||||
|
cmake_minimum_required(VERSION 3.7.0) |
||||||
|
|
||||||
|
project(sending_arguments LANGUAGES CXX) |
||||||
|
|
||||||
|
set(CMAKE_AUTOMOC ON) |
||||||
|
|
||||||
|
# SingleApplication base class |
||||||
|
set(QAPPLICATION_CLASS QCoreApplication) |
||||||
|
add_subdirectory(../.. SingleApplication) |
||||||
|
|
||||||
|
find_package(Qt${QT_DEFAULT_MAJOR_VERSION} COMPONENTS Core REQUIRED) |
||||||
|
|
||||||
|
add_executable(${PROJECT_NAME} |
||||||
|
main.cpp |
||||||
|
messagereceiver.cpp |
||||||
|
messagereceiver.h |
||||||
|
main.cpp |
||||||
|
) |
||||||
|
|
||||||
|
target_link_libraries(${PROJECT_NAME} SingleApplication::SingleApplication) |
@ -0,0 +1,28 @@ |
|||||||
|
#include <singleapplication.h> |
||||||
|
#include "messagereceiver.h" |
||||||
|
|
||||||
|
int main(int argc, char *argv[]) |
||||||
|
{ |
||||||
|
// Allow secondary instances
|
||||||
|
SingleApplication app( argc, argv, true ); |
||||||
|
|
||||||
|
MessageReceiver msgReceiver; |
||||||
|
|
||||||
|
// If this is a secondary instance
|
||||||
|
if( app.isSecondary() ) { |
||||||
|
app.sendMessage( app.arguments().join(' ').toUtf8() ); |
||||||
|
qDebug() << "App already running."; |
||||||
|
qDebug() << "Primary instance PID: " << app.primaryPid(); |
||||||
|
qDebug() << "Primary instance user: " << app.primaryUser(); |
||||||
|
return 0; |
||||||
|
} else { |
||||||
|
QObject::connect( |
||||||
|
&app, |
||||||
|
&SingleApplication::receivedMessage, |
||||||
|
&msgReceiver, |
||||||
|
&MessageReceiver::receivedMessage |
||||||
|
); |
||||||
|
} |
||||||
|
|
||||||
|
return app.exec(); |
||||||
|
} |
@ -0,0 +1,12 @@ |
|||||||
|
#include <QDebug> |
||||||
|
#include "messagereceiver.h" |
||||||
|
|
||||||
|
MessageReceiver::MessageReceiver(QObject *parent) : QObject(parent) |
||||||
|
{ |
||||||
|
} |
||||||
|
|
||||||
|
void MessageReceiver::receivedMessage(int instanceId, QByteArray message) |
||||||
|
{ |
||||||
|
qDebug() << "Received message from instance: " << instanceId; |
||||||
|
qDebug() << "Message Text: " << message; |
||||||
|
} |
@ -0,0 +1,15 @@ |
|||||||
|
#ifndef MESSAGERECEIVER_H |
||||||
|
#define MESSAGERECEIVER_H |
||||||
|
|
||||||
|
#include <QObject> |
||||||
|
|
||||||
|
class MessageReceiver : public QObject |
||||||
|
{ |
||||||
|
Q_OBJECT |
||||||
|
public: |
||||||
|
explicit MessageReceiver(QObject *parent = 0); |
||||||
|
public slots: |
||||||
|
void receivedMessage( int instanceId, QByteArray message ); |
||||||
|
}; |
||||||
|
|
||||||
|
#endif // MESSAGERECEIVER_H
|
@ -0,0 +1,9 @@ |
|||||||
|
# Single Application implementation |
||||||
|
include(../../singleapplication.pri) |
||||||
|
DEFINES += QAPPLICATION_CLASS=QCoreApplication |
||||||
|
|
||||||
|
SOURCES += main.cpp \ |
||||||
|
messagereceiver.cpp |
||||||
|
|
||||||
|
HEADERS += \ |
||||||
|
messagereceiver.h |
Loading…
Reference in new issue