nimqt icon indicating copy to clipboard operation
nimqt copied to clipboard

'slot/slot_defer' compilation error

Open matkuki opened this issue 1 year ago • 5 comments

Hi,

I'm on Windows x64, Nim devel, nimqt head. This is my object override:

inheritQObject(AdvancedTabBarButton, QGroupBox):
    var name: QString = ""
    var title: QString = ""
    var image_path: QString = ""
    var labels: seq[ptr QLabel] = newSeq()
    var value: bool = false
    var pressed: bool = false
    var dragging: bool = false
    var position_cache: QPoint = newQPoint(-9999.cint, -9999.cint)
    
    # Signals
    signal signal_click(name: QString, button: int)
    signal signal_close(name: QString)
    signal signal_drag_start()
    
    # Slots
    slot_defer onclick(name: string, button: Qt_MouseButton):
        if button == Qt_MouseButton.LeftButton:
            if name != "close":
                echo "click"
            elif name == "close":
                echo "close"

Compilation in Nim succeeds, but the MSVC++ compilation fails with:

.Hint: used config file 'C:\Users\...\.choosenim\toolchains\nim-#devel\config\nim.cfg' [Conf]
Hint: used config file 'C:\Users\...\.choosenim\toolchains\nim-#devel\config\config.nims' [Conf]
Hint: used config file 'E:\TEST\nim.cfg' [Conf]
[NimScript] exec: C:/Program Files (x86)/Microsoft Visual Studio/2019/Community/VC/Auxiliary/Build/vcvars64.bat
**********************************************************************
** Visual Studio 2019 Developer Command Prompt v16.11.37
** Copyright (c) 2021 Microsoft Corporation
**********************************************************************
[vcvarsall.bat] Environment initialized for: 'x64'
[NimScript] exec: nim cpp --cc:vcc --outdir:build --mm:orc --nimcache:nimcache --passC:" -Zc:wchar_t -FS -Zc:rvalueCast -Zc:inline -Zc:throwingNew -Zc:externConstexpr -O2 -MD -utf-8 -W3 -w34100 -w34189 -w44996 -w44456 -w44457 -w44458 -wd4577 -wd4467 -EHsc -DUNICODE -D_UNICODE -DWIN32 -D_ENABLE_EXTENDED_ALIGNED_STORAGE -DWIN64 -DNDEBUG -DQT_NO_DEBUG -DQT_WIDGETS_LIB -DQT_GUI_LIB -DQT_CORE_LIB -I. -IC:\Nim\lib -IE:\Qt6\6.3.1\msvc2019_64\include -IE:\Qt6\6.3.1\msvc2019_64\include\QtWidgets -IE:\Qt6\6.3.1\msvc2019_64\include\QtGui -IE:\Qt6\6.3.1\msvc2019_64\include\QtCore -I/include -IE:\Qt6\6.3.1\msvc2019_64\mkspecs\win32-msvc -I.\dependencies\nimqt\qt\6.4.3_most /Zc:strictStrings-" --passL:" /NOLOGO /DYNAMICBASE /NXCOMPAT /OPT:REF /OPT:ICF /INCREMENTAL:NO /SUBSYSTEM:CONSOLE " --clib:E:\Qt6\6.3.1\msvc2019_64\lib\Qt6Widgets --clib:E:\Qt6\6.3.1\msvc2019_64\lib\Qt6Gui --clib:E:\Qt6\6.3.1\msvc2019_64\lib\Qt6Core --clib:E:\Qt6\6.3.1\msvc2019_64\lib\Qt6EntryPoint src/exco.nim
Hint: used config file 'C:\Users\...\.choosenim\toolchains\nim-#devel\config\nim.cfg' [Conf]
Hint: used config file 'C:\Users\...\.choosenim\toolchains\nim-#devel\config\config.nims' [Conf]
Hint: used config file 'E:\TEST\nim.cfg' [Conf]
Hint: used config file 'E:\TEST\src\exco.nim.cfg' [Conf]
.....................................................................................................................................................................................................................................................................................................................
E:\TEST\dependencies\nimqt\qt\6.4.3_most\nimqt.nim(70, 25) Warning: imported and not used: 'qstring' [UnusedImport]
.........
E:\TEST\dependencies\nimqt\qt\6.4.3_most\nimqt.nim(316, 27) Hint: 'signal_click' is declared but not used [XDeclaredButNotUsed]
E:\TEST\dependencies\nimqt\qt\6.4.3_most\nimqt.nim(316, 27) Hint: 'signal_drag_start' is declared but not used [XDeclaredButNotUsed]
E:\TEST\dependencies\nimqt\qt\6.4.3_most\nimqt.nim(316, 27) Hint: 'signal_drag_start' is declared but not used [XDeclaredButNotUsed]
E:\TEST\dependencies\nimqt\qt\6.4.3_most\nimqt.nim(316, 27) Hint: 'signal_close' is declared but not used [XDeclaredButNotUsed]
E:\TEST\dependencies\nimqt\qt\6.4.3_most\nimqt.nim(316, 27) Hint: 'signal_close' is declared but not used [XDeclaredButNotUsed]
E:\TEST\src\gui\tabwidget.nim(132, 6) Hint: 'create_button' is declared but not used [XDeclaredButNotUsed]
E:\TEST\src\gui\tabwidget.nim(173, 6) Hint: 'set_hover' is declared but not used [XDeclaredButNotUsed]
E:\TEST\src\gui\tabwidget.nim(64, 6) Hint: 'set_selected' is declared but not used [XDeclaredButNotUsed]
E:\TEST\src\gui\tabwidget.nim(19, 8) Warning: imported and not used: 'nimqthelpers' [UnusedImport]
.
E:\TEST\dependencies\nimqt\qt\6.4.3_most\nimqt.nim(316, 27) Hint: 'foo0' is declared but not used [XDeclaredButNotUsed]
E:\TEST\dependencies\nimqt\qt\6.4.3_most\nimqt.nim(70, 25) Warning: imported and not used: 'qstring' [UnusedImport]
.
E:\TEST\src\gui\mainwindow.nim(89, 9) Hint: 'global_signal_handler' is declared but not used [XDeclaredButNotUsed]
E:\TEST\src\gui\mainwindow.nim(8, 8) Warning: imported and not used: 'strutils' [UnusedImport]
E:\TEST\dependencies\nimqt\qt\6.4.3_most\nimqt.nim(72, 24) Warning: imported and not used: 'qevent' [UnusedImport]
E:\TEST\src\exco.nim(24, 16) Warning: imported and not used: 'nimqthelpers' [UnusedImport]
E:\TEST\dependencies\nimqt\qt\6.4.3_most\nimqt.nim(70, 25) Warning: imported and not used: 'qstring' [UnusedImport]
E:\TEST\dependencies\nimqt\qt\6.4.3_most\nimqt.nim(71, 25) Warning: imported and not used: 'qobject' [UnusedImport]
CC: gui/tabwidget.nim
cl : Command line warning D9027 : source file 'shell32.lib' ignored
@[email protected]
nimcache\@[email protected](80): error C2061: syntax error: identifier 'string'
nimcache\@[email protected](250): error C2061: syntax error: identifier 'string'
nimcache\@[email protected](263): error C2061: syntax error: identifier 'string'
nimcache\@[email protected](267): error C2761: 'void AdvancedTabBarButton::onclick(void)': redeclaration of member is not allowed
nimcache\@[email protected](267): error C2065: 'string': undeclared identifier
nimcache\@[email protected](267): error C2146: syntax error: missing ')' before identifier 'name'
nimcache\@[email protected](267): error C2143: syntax error: missing ';' before '{'
nimcache\@[email protected](267): error C2447: '{': missing function header (old-style formal list?)
nimcache\@[email protected](410): error C2061: syntax error: identifier 'string'
nimcache\@[email protected](413): error C2065: 'button_p2': undeclared identifier
nimcache\@[email protected](415): error C2065: 'name_p1': undeclared identifier
nimcache\@[email protected](421): error C2065: 'name_p1': undeclared identifier
Error: execution of an external compiler program 'vccexe.exe /c --platform:amd64  /nologo /EHsc -DWIN32_LEAN_AND_MEAN -permissive- -Zc:__cplusplus -std:c++17 -IE:/Qt6/6.3.1/msvc2019_64/include -IE:/Qt6/6.3.1/msvc2019_64/include\QtWidgets -IE:/Qt6/6.3.1/msvc2019_64/include\QtGui -IE:/Qt6/6.3.1/msvc2019_64/include\QtCore -IE:/Qt6/6.3.1/msvc2019_64/include\..\mkspecs\win32-msvc /Zc:strictStrings- shell32.lib -Zc:wchar_t -FS -Zc:rvalueCast -Zc:inline -Zc:throwingNew -Zc:externConstexpr -O2 -MD -utf-8 -W3 -w34100 -w34189 -w44996 -w44456 -w44457 -w44458 -wd4577 -wd4467 -EHsc -DUNICODE -D_UNICODE -DWIN32 -D_ENABLE_EXTENDED_ALIGNED_STORAGE -DWIN64 -DNDEBUG -DQT_NO_DEBUG -DQT_WIDGETS_LIB -DQT_GUI_LIB -DQT_CORE_LIB -I. -IC:\Nim\lib -IE:\Qt6\6.3.1\msvc2019_64\include -IE:\Qt6\6.3.1\msvc2019_64\include\QtWidgets -IE:\Qt6\6.3.1\msvc2019_64\include\QtGui -IE:\Qt6\6.3.1\msvc2019_64\include\QtCore -I/include -IE:\Qt6\6.3.1\msvc2019_64\mkspecs\win32-msvc -I.\dependencies\nimqt\qt\6.4.3_most /Zc:strictStrings-   /IC:\Users\...\.choosenim\toolchains\nim-#devel\lib /IE:\TEST\src /nologo /FoE:\TEST\nimcache\@[email protected] E:\TEST\nimcache\@[email protected]' failed with exit code: 2


stack trace: (most recent call last)
E:\TEST\exco_build.nims(91, 9)
C:\Users\...\.choosenim\toolchains\nim-#devel\lib\system\nimscript.nim(264, 7) exec
C:\Users\...\.choosenim\toolchains\nim-#devel\lib\system\nimscript.nim(264, 7) Error: unhandled exception: FAILED: nim cpp --cc:vcc --outdir:build --mm:orc --nimcache:nimcache --passC:" -Zc:wchar_t -FS -Zc:rvalueCast -Zc:inline -Zc:throwingNew -Zc:externConstexpr -O2 -MD -utf-8 -W3 -w34100 -w34189 -w44996 -w44456 -w44457 -w44458 -wd4577 -wd4467 -EHsc -DUNICODE -D_UNICODE -DWIN32 -D_ENABLE_EXTENDED_ALIGNED_STORAGE -DWIN64 -DNDEBUG -DQT_NO_DEBUG -DQT_WIDGETS_LIB -DQT_GUI_LIB -DQT_CORE_LIB -I. -IC:\Nim\lib -IE:\Qt6\6.3.1\msvc2019_64\include -IE:\Qt6\6.3.1\msvc2019_64\include\QtWidgets -IE:\Qt6\6.3.1\msvc2019_64\include\QtGui -IE:\Qt6\6.3.1\msvc2019_64\include\QtCore -I/include -IE:\Qt6\6.3.1\msvc2019_64\mkspecs\win32-msvc -I.\dependencies\nimqt\qt\6.4.3_most /Zc:strictStrings-" --passL:" /NOLOGO /DYNAMICBASE /NXCOMPAT /OPT:REF /OPT:ICF /INCREMENTAL:NO /SUBSYSTEM:CONSOLE " --clib:E:\Qt6\6.3.1\msvc2019_64\lib\Qt6Widgets --clib:E:\Qt6\6.3.1\msvc2019_64\lib\Qt6Gui --clib:E:\Qt6\6.3.1\msvc2019_64\lib\Qt6Core --clib:E:\Qt6\6.3.1\msvc2019_64\lib\Qt6EntryPoint src/exco.nim [OSError]

The problem is in the slot_defer (I tried slot and it's the same), but I don't know why. Any ideas?

matkuki avatar Oct 20 '24 17:10 matkuki

Hi, an issue I see is that you should use QString instead of string. Does that resolve your issue? If not, can you give me a full MWE (including the imports etc)?

jerous86 avatar Oct 22 '24 18:10 jerous86

Here is the code that reproduces the problem:

# Imports
import strformat
import nimqt
import nimqt / [
    qlabel,
    qlayout,
    qboxlayout,
    qgroupbox,
    qtabwidget,
    qdrag,
    qmimedata,
    qvariant,
]

# nimqt initialization
nimqt.init()

## AdvancedTabBarButton
inheritQObject(AdvancedTabBarButton, QGroupBox):
    var name: QString = ""
    var title: QString = ""
    var image_path: QString = ""
    var labels: seq[ptr QLabel] = newSeq()
    var value: bool = false
    var pressed: bool = false
    var dragging: bool = false
    var position_cache: QPoint = newQPoint(-9999.cint, -9999.cint)
    
    # Signals
    signal signal_click(name: QString, button: int)
    signal signal_close(name: QString)
    signal signal_drag_start()
    
    # Slots
    slot_defer onclick(name: string, button: Qt_MouseButton):
        if button == Qt_MouseButton.LeftButton:
            if name != "close":
                echo "click"
            elif name == "close":
                echo "close"

nimqt.insertAllSlotImplementations()

an issue I see is that you should use QString instead of string. Does that resolve your issue?

Changing that produces the next problem in the MSVC++ compilation:

nimcache\@merror_reproducing.nim.cpp(60): error C2061: syntax error: identifier 'Qt_MouseButton'

... but why can't I use a string (or bool, or ...) in a slot? Thanks

matkuki avatar Oct 22 '24 20:10 matkuki

... but why can't I use a string (or bool, or ...) in a slot?

I think you can use bool etc in a slot. The string is not mapped to std::string, I don't know why. Using QString bypasses that problem (but that would not be a satisfactory solution)

nimcache@merror_reproducing.nim.cpp(60): error C2061: syntax error: identifier 'Qt_MouseButton'

I also encounter here an issue with Qt_MouseButton: error: unknown type name 'Qt_MouseButton'; did you mean 'Qt::MouseButton?. If I look in qtcore/qnamespace.nim, then I find that Qt_MouseButton* {.header:headerFile,importcpp:"Qt::MouseButton".} = enum ... so I would assume that nim maps Qt_MouseButton to Qt::MouseButton, but maybe due to the macros this does not happen.

Did you encounter this also with earlier compiler versions of nim (or I guess you did not have this code when you were using an older version of nim?)

jerous86 avatar Oct 23 '24 22:10 jerous86

Did you encounter this also with earlier compiler versions of nim (or I guess you did not have this code when you were using an older version of nim?)

Unfortunately no, this is the first time I've used Qt_MouseButton in a slot. Actually, this is the first time I've used slots with arguments.

matkuki avatar Oct 24 '24 07:10 matkuki

I had a look into it, and found what's going wrong. I have some solution in mind, but still need to code it up. I hope to implement it this week.

jerous86 avatar Nov 14 '24 23:11 jerous86