#############################################################################
##
## Copyright (C) 2016 The Qt Company Ltd.
## Contact: https://www.qt.io/licensing/
##
## This file is part of the ActiveQt module of the Qt Toolkit.
##
## $QT_BEGIN_LICENSE:GPL-EXCEPT$
## 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.
##
## GNU General Public License Usage
## Alternatively, this file may be used under the terms of the GNU
## General Public License version 3 as published by the Free Software
## Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT
## included in the packaging of this file. Please review the following
## information to ensure the GNU General Public License requirements will
## be met: https://www.gnu.org/licenses/gpl-3.0.html.
##
## $QT_END_LICENSE$
##
#############################################################################

sub QAxWidget2_Click {
    $QAxWidget2->{'lineWidth'} = $QAxWidget2->{'lineWidth'} + 1;
    $MainWindow->logMacro(0, "Hello from Perl: QAxWidget2_Click", 0, "");
}

sub fatLines
{
    $QAxWidget2->{'lineWidth'} = 25;
}

sub thinLines
{
    $QAxWidget2->{'lineWidth'} = 1;
}

sub setLineWidth(width)
{
    $QAxWidget2->{'lineWidth'} = width;
}

sub getLineWidth()
{
    return $QAxWidget2->{'lineWidth'};
}
