Folder structure in Gui changed, window size to fullscreen, scrollview in AddCustomer

This commit is contained in:
2025-05-14 09:54:51 +02:00
parent 591216c9a8
commit 75427b1326
18 changed files with 1621 additions and 362 deletions

View File

@@ -1,120 +1,120 @@
import QtQuick // import QtQuick
import QtQuick.Layouts // import QtQuick.Layouts
import QtQuick.Controls // import QtQuick.Controls
import QtQuick.Dialogs // import QtQuick.Dialogs
import Js // import Js
ColumnLayout // ColumnLayout
{ // {
property var new_business: null // property var new_business: null
Layout.fillWidth: true // Layout.fillWidth: true
Layout.fillHeight: true // Layout.fillHeight: true
spacing: 15 // spacing: 15
Label // Label
{ // {
text: qsTr("Kunden anlegen") // text: qsTr("Kunden anlegen")
horizontalAlignment: Text.AlignHCenter // horizontalAlignment: Text.AlignHCenter
Layout.fillWidth: true // Layout.fillWidth: true
font.pixelSize: 35 // font.pixelSize: 35
} // }
CheckBox // CheckBox
{ // {
id: checkAddContact // id: checkAddContact
text: qsTr("Ansprechpartner hinzufügen") // text: qsTr("Ansprechpartner hinzufügen")
Layout.alignment: Qt.AlignRight // Layout.alignment: Qt.AlignRight
checked: false // checked: false
onCheckStateChanged: // onCheckStateChanged:
{ // {
checkFields() // checkFields()
} // }
} // }
RowLayout // RowLayout
{ // {
id: addCustomer // id: addCustomer
Layout.fillWidth: true // Layout.fillWidth: true
Layout.fillHeight: true // Layout.fillHeight: true
spacing: 45 // spacing: 45
Frame // Frame
{ // {
Layout.alignment: Qt.AlignTop // Layout.alignment: Qt.AlignTop
Layout.fillWidth: true // Layout.fillWidth: true
CustomerView // CustomerView
{ // {
id: customerView // id: customerView
width: parent.width // width: parent.width
} // }
} // }
AddContact // AddContact
{ // {
id: addContactFrame // id: addContactFrame
visible: checkAddContact.checked // visible: checkAddContact.checked
} // }
} // }
RowLayout // RowLayout
{ // {
Layout.fillHeight: true // Layout.fillHeight: true
Layout.alignment: Qt.AlignRight // Layout.alignment: Qt.AlignRight
Button // Button
{ // {
text: qsTr("Abbrechen") // text: qsTr("Abbrechen")
onClicked: contentStack.pop() // onClicked: contentStack.pop()
} // }
Button // Button
{ // {
id: saveBtn // id: saveBtn
text: qsTr("Speichern") // text: qsTr("Speichern")
enabled: false // enabled: false
onClicked: // onClicked:
{ // {
if (!checkAddContact.checked) // if (!checkAddContact.checked)
{ // {
new_business = JsLib.parseForm(customerView) // new_business = JsLib.parseForm(customerView)
business_model.addBusiness(new_business, 0) // business_model.addBusiness(new_business, 0)
contentStack.pop() // contentStack.pop()
} // }
else // else
{ // {
new_business = JsLib.parseForm(customerView) // new_business = JsLib.parseForm(customerView)
var new_contact = JsLib.parseForm(addContactFrame.contactGrid) // var new_contact = JsLib.parseForm(addContactFrame.contactGrid)
contact_model.addContact(new_contact) // contact_model.addContact(new_contact)
} // }
} // }
} // }
} // }
Item // Item
{ // {
id: spacer3 // id: spacer3
Layout.fillHeight: true // Layout.fillHeight: true
} // }
//Component.onCompleted: contact_model.contactIdReady.connect(onContactId) // //Component.onCompleted: contact_model.contactIdReady.connect(onContactId)
Connections // Connections
{ // {
target: contact_model // target: contact_model
function onContactIdReady() // function onContactIdReady()
{ // {
var con_id = arguments[0] // var con_id = arguments[0]
business_model.addBusiness(new_business, con_id) // business_model.addBusiness(new_business, con_id)
contentStack.pop() // contentStack.pop()
} // }
} // }
function checkFields() // function checkFields()
{ // {
if(checkAddContact.checked) // if(checkAddContact.checked)
{ // {
if(!customerView.checkBusinessField() || !addContactFrame.checkContactField()) // if(!customerView.checkBusinessField() || !addContactFrame.checkContactField())
saveBtn.enabled = false // saveBtn.enabled = false
else // else
saveBtn.enabled = true // saveBtn.enabled = true
} // }
else if (!customerView.checkBusinessField()) // else if (!customerView.checkBusinessField())
saveBtn.enabled = false // saveBtn.enabled = false
else // else
saveBtn.enabled = true // saveBtn.enabled = true
} // }
} // }

View File

@@ -0,0 +1,133 @@
import QtQuick
import QtQuick.Layouts
import QtQuick.Controls
import QtQuick.Dialogs
import Js
import Gui
ScrollView
{
id: scroll
width: parent.width
height: parent.height
ColumnLayout
{
property var new_business: null
height: Screen.desktopAvailableHeight
width: scroll.width
Layout.fillWidth: true
Layout.fillHeight: true
spacing: 15
Label
{
text: qsTr("Kunden anlegen")
horizontalAlignment: Text.AlignHCenter
Layout.fillWidth: true
font.pixelSize: 35
}
CheckBox
{
id: checkAddContact
text: qsTr("Ansprechpartner hinzufügen")
Layout.alignment: Qt.AlignRight
checked: false
onCheckStateChanged:
{
checkFields()
}
}
RowLayout
{
id: addCustomer
// Layout.fillWidth: true
// Layout.fillHeight: true
spacing: 45
Frame
{
Layout.alignment: Qt.AlignTop
Layout.fillWidth: true
CustomerView
{
id: customerView
width: parent.width
}
}
AddContact
{
id: addContactFrame
visible: checkAddContact.checked
}
}
RowLayout
{
Layout.fillHeight: true
Layout.alignment: Qt.AlignRight
Button
{
text: qsTr("Abbrechen")
onClicked: contentStack.pop()
}
Button
{
id: saveBtn
text: qsTr("Speichern")
enabled: true
onClicked:
{
if (!checkAddContact.checked)
{
new_business = JsLib.parseForm(customerView)
business_model.addBusiness(new_business, 0)
contentStack.pop()
}
else
{
new_business = JsLib.parseForm(customerView)
var new_contact = JsLib.parseForm(addContactFrame.contactGrid)
contact_model.addContact(new_contact)
}
}
}
}
Item
{
id: spacer3
Layout.fillHeight: true
}
//Component.onCompleted: contact_model.contactIdReady.connect(onContactId)
Connections
{
target: contact_model
function onContactIdReady()
{
var con_id = arguments[0]
business_model.addBusiness(new_business, con_id)
contentStack.pop()
}
}
function checkFields()
{
if(checkAddContact.checked)
{
if(!customerView.checkBusinessField() || !addContactFrame.checkContactField())
saveBtn.enabled = false
else
saveBtn.enabled = true
}
else if (!customerView.checkBusinessField())
saveBtn.enabled = false
else
saveBtn.enabled = true
}
}
}

View File

@@ -0,0 +1,174 @@
import QtQuick
import QtQuick.Controls
import QtQuick.Layouts
GridLayout
{
columns: 2
rowSpacing: 25
Layout.leftMargin: 7
// Grid row
ColumnLayout
{
Layout.columnSpan: 2
Label
{
id: contactLabel
color: "darksalmon"
font.bold: true
text: qsTr("Ansprechpartner")
}
Label
{
color: "goldenrod"
text: contact? contact['contact']['salute'] + " " + contact['contact']['fname'] + " " + contact['contact']['lname']: ""
}
}
// Grid row
ColumnLayout
{
Label
{
color: "darksalmon"
text: qsTr("Geburtsdatum")
font.bold: true
}
Label
{
color: "goldenrod"
text: contact? contact['contact']['birthday']: ""
}
}
ColumnLayout
{
Label
{
color: "darksalmon"
text: qsTr("E-Mail")
font.bold: true
}
Label
{
color: "goldenrod"
text: contact? contact['contact']['email']: ""
}
}
// Grid row
ColumnLayout
{
Label
{
color: "darksalmon"
text: qsTr("Position")
font.bold: true
}
Label
{
color: "goldenrod"
text: contact? contact['contact']['position']: ""
}
}
ColumnLayout
{
Label
{
color: "darksalmon"
text: qsTr("Priorität")
font.bold: true
}
Label
{
color: "goldenrod"
text: contact? contact['contact']['priority']: ""
}
}
// Grid row
ColumnLayout
{
Label
{
color: "darksalmon"
text: qsTr("Telefon")
font.bold: true
}
Label
{
color: "goldenrod"
text: contact? contact['contact']['phone']: ""
}
}
ColumnLayout
{
Label
{
color: "darksalmon"
text: qsTr("Handy")
font.bold: true
}
Label
{
color: "goldenrod"
text: contact? contact['contact']['cell']: ""
}
}
// Grid row
ColumnLayout
{
Label
{
color: "darksalmon"
text: qsTr("Abrechnung")
font.bold: true
}
Label
{
color: "goldenrod"
text: contact? contact['contact']['invoice']: ""
}
}
ColumnLayout
{
Label
{
color: "darksalmon"
text: qsTr("Mahnung")
font.bold: true
}
Label
{
color: "goldenrod"
text: contact? contact['contact']['reminder']: ""
}
}
// Grid row
Item
{
Layout.columnSpan: 2
Layout.fillHeight: true
}
Component.onCompleted:
{
if (contact && contact['contact']['salute'] === "Frau")
contactLabel.text = qsTr("Ansprechpartnerin")
}
}

View File

@@ -0,0 +1,61 @@
import QtQuick
import QtQuick.Controls
import QtQuick.Layouts
ColumnLayout
{
property int selectedClient: -1
property var client: null
property var contact: null
id: clDet
Button
{
text: qsTr("Zurück")
onClicked: contentStack.pop()
}
SplitView
{
id: clDetView
Layout.fillHeight: true
Layout.fillWidth: true
leftPadding: 9
rightPadding: 9
CustomerDetailsView
{
id: customerDetails
}
CustomerContactDetails
{
id: contactDetails
visible: false
}
NoCustomerContact
{
id: noCustomerContact
visible: false
}
}
Item
{
//Layout.columnSpan: 2
Layout.fillHeight: true
}
Component.onCompleted:
{
//business_model.onRowClicked(selectedClient)
client = business_model.getClientDetails()
if (client['business']['contactid'] > 0)
{
contact = contact_model.getContactDetails(client['business']['contactid'])
contactDetails.visible = true
}
else noCustomerContact.visible = true
}
}

View File

@@ -0,0 +1,225 @@
import QtQuick
import QtQuick.Controls
import QtQuick.Layouts
GridLayout
{
columns: 2
rowSpacing: 25
SplitView.preferredWidth: clDetView.width / 3 * 1.8
// Grid row
ColumnLayout
{
Label
{
color: "darksalmon"
text: qsTr("Steuer-ID")
font.bold: true
}
Label
{
color: "goldenrod"
text: client['business']['tax']? client['business']['tax']: ""
}
}
ColumnLayout
{
Label
{
color: "darksalmon"
text: qsTr("Anmerkungen")
font.bold: true
}
Label
{
color: "goldenrod"
text: client['business']['info']? client['business']['info']: ""
}
}
// Grid row
ColumnLayout
{
Label
{
color: "darksalmon"
text: qsTr("Kundenname")
font.bold: true
}
Label
{
color: "goldenrod"
text: client['business']['company']
}
}
ColumnLayout
{
Label
{
color: "darksalmon"
text: qsTr("CEO")
font.bold: true
}
Label
{
color: "goldenrod"
text: client['business']['ceo']
}
}
// Grid row
ColumnLayout
{
Label
{
color: "darksalmon"
text: qsTr("Telefon")
font.bold: true
}
Label
{
color: "goldenrod"
text: client['business']['phone']? client['business']['phone']: ""
}
}
ColumnLayout
{
Label
{
color: "darksalmon"
text: qsTr("Handy")
font.bold: true
}
Label
{
color: "goldenrod"
text: client['business']['cell']? client['business']['cell']: ""
}
}
// Grid row
ColumnLayout
{
Label
{
color: "darksalmon"
text: qsTr("Webseite")
font.bold: true
}
Label
{
id: clientWebsite
color: "goldenrod"
font.underline: false
text: client['business']['website']? '<a href="' + client['business']['website'] + '">' + client['business']['website'] + '</a>': ""
onLinkActivated:
{
var web_protocol = /^((http|https):\/\/)/;
var client_website = !web_protocol.test(client['business']['website'])? "https://" + client['business']['website']: client['business']['website'];
Qt.openUrlExternally(client_website)
}
}
}
ColumnLayout
{
Label
{
color: "darksalmon"
text: qsTr("E-Mail")
font.bold: true
}
Label
{
id: clientEmail
color: "goldenrod"
text: client['business']['email']? '<a href="mailto:' + client['business']['email'] + '">' + client['business']['email'] + '</a>': ""
onLinkActivated: Qt.openUrlExternally('mailto:' + client['business']['email'])
}
}
// Grid row
ColumnLayout
{
Label
{
color: "darksalmon"
text: qsTr("Straße")
font.bold: true
}
Label
{
color: "goldenrod"
text: client['business']['street']? client['business']['tax']: ""
}
}
ColumnLayout
{
Label
{
color: "darksalmon"
text: qsTr("Haus-Nr.")
font.bold: true
}
Label
{
color: "goldenrod"
text: client['business']['house']? client['business']['house']: ""
}
}
// Grid row
ColumnLayout
{
Label
{
color: "darksalmon"
text: qsTr("PLZ")
font.bold: true
}
Label
{
color: "goldenrod"
text: client['business']['zip']? client['business']['zip']: ""
}
}
ColumnLayout
{
Label
{
color: "darksalmon"
text: qsTr("Stadt")
font.bold: true
}
Label
{
color: "goldenrod"
text: client['business']['city']? client['business']['city']: ""
}
}
// Grid row
// Item
// {
// Layout.columnSpan: 2
// Layout.fillHeight: true
// }
}

View File

@@ -0,0 +1,293 @@
import QtQuick
import QtQuick.Controls
import QtQuick.Layouts
GridLayout
{
id: customerView
columns: 4
Layout.fillWidth: true
Layout.fillHeight: true
rowSpacing: 9
property alias businesstxt: firmenName
property alias street: streetid
property alias postcodetxt: postcode
property alias citytxt: city
Label
{
id: lblFirmenName
text: qsTr("Firmenname*")
Layout.alignment: Qt.AlignRight | Qt.AlignVCenter
}
TextField
{
property string name: "business"
id: firmenName
Layout.fillWidth: true
Layout.alignment: Qt.AlignVCenter
onTextChanged: checkFields()
Layout.columnSpan: 3
}
Label
{
text: qsTr("Land")
Layout.alignment: Qt.AlignRight | Qt.AlignVCenter
visible: false
}
ComboBox
{
property string name: "country"
id: country
Layout.fillWidth: true
editable: true
// onEditTextChanged: checkFields()
// onCurrentTextChanged: checkFields()
model: address_model
textRole: "country"
popup.height: 300
currentIndex: 37
Layout.columnSpan: 3
visible: false
}
Label
{
text: qsTr("PLZ")
Layout.alignment: Qt.AlignRight
}
ComboBox
{
property string name: "postcode"
id: postcode
Layout.fillWidth: true
editable: true
onCurrentTextChanged: checkFields()
onEditTextChanged: checkFields()
onActivated: currentValue
model: address_model
textRole: "display"
popup.height: 300
currentIndex: -1
onCurrentIndexChanged: city.currentIndex = postcode.currentIndex
Layout.columnSpan: 3
validator: RegularExpressionValidator
{
regularExpression: /([0-9]{1,5})/
}
}
Label
{
text: qsTr("Ort")
Layout.alignment: Qt.AlignRight | Qt.AlignVCenter
}
ComboBox
{
property string name: "city"
id: city
Layout.fillWidth: true
editable: true
onEditTextChanged: checkFields()
onCurrentTextChanged: checkFields()
model: address_model
textRole: "city"
popup.height: 300
currentIndex: -1
Layout.columnSpan: 3
}
Label
{
text: qsTr("Straße*")
Layout.alignment: Qt.AlignRight | Qt.AlignVCenter
}
TextField
{
property string name: "street"
id: streetid
Layout.fillWidth: true
onTextChanged: checkFields()
}
Label
{
text: qsTr("Nr.*")
Layout.alignment: Qt.AlignRight | Qt.AlignVCenter
}
TextField
{
property string name: "houseno"
id: housenoid
Layout.fillWidth: true
onTextChanged: checkFields()
validator: RegularExpressionValidator
{
regularExpression: /([0-9a-zA-Z\-]{1,6})/
}
}
Label
{
text: qsTr("Telefon")
Layout.alignment: Qt.AlignRight | Qt.AlignVCenter
}
TextField
{
property string name: "telephone"
id: telephone
Layout.fillWidth: true
Layout.columnSpan: 3
validator: RegularExpressionValidator
{
regularExpression: /([+0-9]{1})([0-9]{1,17})/
}
}
Label
{
text: qsTr("Mobil")
Layout.alignment: Qt.AlignRight | Qt.AlignVCenter
}
TextField
{
property string name: "cellphone"
id: cellphone
Layout.fillWidth: true
Layout.columnSpan: 3
validator: RegularExpressionValidator
{
regularExpression: /([+0-9]{1})([0-9]{1,17})/
}
}
Label
{
text: qsTr("E-Mail")
Layout.alignment: Qt.AlignRight
}
TextField
{
property string name: "email"
id: email
Layout.fillWidth: true
placeholderText: qsTr("beispiel@domain.de")
Layout.columnSpan: 3
validator: RegularExpressionValidator
{
regularExpression: /([\+!#$%&\*\\/\=?\^_`\.{|}\~\-\_0-9A-Za-z]{1,185})@([0-9A-Za-z\.\-\_]{1,64})\.([a-zA-z]{2,5})/
}
}
Label
{
text: qsTr("Homepage")
Layout.alignment: Qt.AlignRight
}
TextField
{
property string name: "homepage"
id: homepage
Layout.fillWidth: true
Layout.columnSpan: 3
placeholderText: "www.oschkarischtverhaftetwegensexy.jinx"
}
Label
{
text: qsTr("Geschäftsführer")
Layout.alignment: Qt.AlignRight
}
TextField
{
property string name: "ceo"
id: ceo
Layout.fillWidth: true
Layout.columnSpan: 3
}
Label
{
text: qsTr("USt-IdNr")
Layout.alignment: Qt.AlignRight
}
TextField
{
property string name: "taxno"
id: taxno
Layout.fillWidth: true
Layout.columnSpan: 3
}
Label
{
text: qsTr("Typ")
Layout.alignment: Qt.AlignRight
}
ComboBox
{
property string name: "typeid"
id: typeid
Layout.fillWidth: true
editable: false
model: business_type
textRole: "display"
Layout.columnSpan: 3
}
Label
{
text: qsTr("Info")
Layout.alignment: Qt.AlignRight | Qt.AlignTop
}
ScrollView
{
id: infoView
Layout.fillWidth: true
Layout.preferredHeight: 100
Layout.columnSpan: 3
ScrollBar.horizontal: ScrollBar
{
policy: ScrollBar.AlwaysOn
}
TextArea
{
property string name: "customerinfo"
id: customerInfo
implicitWidth: parent.width
wrapMode: TextEdit.Wrap
background: Rectangle
{
color: customerInfo.palette.base
border.color: customerInfo.activeFocus? customerInfo.palette.highlight: customerInfo.palette.base
}
}
}
function checkBusinessField()
{
if (!firmenName.text.trim() || !streetid.text.trim())
{
return false
}
else
{
if (!postcode.editText.trim() || !postcode.currentText || !city.editText.trim() || !city.currentText)
return false
else
return true
}
}
}

View File

@@ -0,0 +1,177 @@
import QtQuick
import QtQuick.Layouts
import QtQuick.Controls
import Qt.labs.qmlmodels
ColumnLayout {
property var availableFilters: ["Name", "Adresse", "PLZ", "Ort"]
function viewCriterion(criterion)
{
business_model.viewCriterion(criterion.text);
}
anchors.fill: parent
spacing: Dimensions.l
Component.onCompleted: contentStack.pop()
RowLayout
{
Layout.fillWidth: true
spacing: Dimensions.l
SearchBar
{
}
QuickFilter {
onSelectedChanged: (name) => {
business_model.viewCriterion(name)
}
model: ListModel {
ListElement {
name: "Alle"
text: qsTr("Alle")
selected: true
}
ListElement {
name: "Interessent"
text: qsTr("Interessent")
selected: false
}
ListElement {
name: "Kunde"
text: qsTr("Kunde")
selected: false
}
ListElement {
name: "Lieferant"
text: qsTr("Lieferant")
selected: false
}
ListElement {
name: "Erledigt"
text: qsTr("Erledigt")
selected: false
}
}
}
Button
{
id: addCustomer
Layout.alignment: Qt.AlignRight
icon.source: "qrc:/images/PlusCircle.svg"
text: qsTr("Kunde Hinzufügen")
onClicked: contentStack.push("AddCustomer.qml")
}
}
ColumnLayout
{
Layout.fillWidth: true
Layout.fillHeight: true
Layout.verticalStretchFactor: 1
clip: true
HorizontalHeaderView
{
id: horizontalHeader
Layout.fillWidth: true
implicitHeight: 40
movableColumns: true //@disable-check M16
syncView: customerTable
delegate: Rectangle
{
Layout.fillWidth: true
border.color: addCustomer.palette.base
color: addCustomer.palette.alternateBase
implicitHeight: 40
implicitWidth: 1
Text
{
color: addCustomer.palette.text
elide: Text.ElideRight
height: parent.height
horizontalAlignment: Text.AlignHCenter
text: model.display
verticalAlignment: Text.AlignVCenter
width: parent.width
}
}
}
TableView {
id: customerTable
property real newWidth: 0
Layout.fillHeight: true
Layout.fillWidth: true
alternatingRows: true
columnSpacing: 1
model: business_model
resizableColumns: true
rowSpacing: 2
selectionBehavior: TableView.SelectRows
z: 1
ScrollBar.vertical: ScrollBar {
policy: customerTable.contentHeight > customerTable.height ? ScrollBar.AlwaysOn : ScrollBar.AlwaysOff
}
delegate: Rectangle {
required property bool current
required property bool selected
color: selected ? addCustomer.palette.highlight //palette.highlight
: (customerTable.alternatingRows && row % 2 !== 0 ? addCustomer.palette.base // palette.base
: addCustomer.palette.alternateBase) //palette.alternateBase)
implicitHeight: 25
implicitWidth: customerTable.width / customerTable.columns
Text {
color: addCustomer.palette.text
elide: Text.ElideRight
height: parent.height
leftPadding: 9
text: model.display == null ? "" : model.display // @disable-check M126
verticalAlignment: Text.AlignVCenter
width: parent.width
}
MouseArea {
id: mouseArea
property bool hovered: false
anchors.fill: parent
hoverEnabled: true
onDoubleClicked: {
business_model.onRowClicked(row);
contentStack.push("CustomerDetails.qml", {
selectedClient: row
});
}
onEntered: {
customerTable.selectionModel.select(customerTable.model.index(row, 0), ItemSelectionModel.SelectCurrent | ItemSelectionModel.Rows);
}
}
}
selectionModel: ItemSelectionModel {
id: selModel
model: customerTable.model
}
}
}
Item {
Layout.fillHeight: true
}
}

1
Gui/Customer/qmldir Normal file
View File

@@ -0,0 +1 @@
module Customer

View File

@@ -1,271 +1,271 @@
import QtQuick // import QtQuick
import QtQuick.Controls // import QtQuick.Controls
import QtQuick.Layouts // import QtQuick.Layouts
GridLayout // GridLayout
{ // {
id: customerView // id: customerView
columns: 4 // columns: 4
Layout.fillWidth: true // Layout.fillWidth: true
Layout.fillHeight: true // Layout.fillHeight: true
rowSpacing: 9 // rowSpacing: 9
property alias businesstxt: firmenName // property alias businesstxt: firmenName
property alias street: streetid // property alias street: streetid
property alias postcodetxt: postcode // property alias postcodetxt: postcode
property alias citytxt: city // property alias citytxt: city
Label // Label
{ // {
id: lblFirmenName // id: lblFirmenName
text: qsTr("Firmenname*") // text: qsTr("Firmenname*")
Layout.alignment: Qt.AlignRight | Qt.AlignVCenter // Layout.alignment: Qt.AlignRight | Qt.AlignVCenter
} // }
TextField // TextField
{ // {
property string name: "business" // property string name: "business"
id: firmenName // id: firmenName
Layout.fillWidth: true // Layout.fillWidth: true
Layout.alignment: Qt.AlignVCenter // Layout.alignment: Qt.AlignVCenter
onTextChanged: checkFields() // onTextChanged: checkFields()
Layout.columnSpan: 3 // Layout.columnSpan: 3
} // }
Label // Label
{ // {
text: qsTr("Straße*") // text: qsTr("Straße*")
Layout.alignment: Qt.AlignRight | Qt.AlignVCenter // Layout.alignment: Qt.AlignRight | Qt.AlignVCenter
} // }
TextField // TextField
{ // {
property string name: "street" // property string name: "street"
id: streetid // id: streetid
Layout.fillWidth: true // Layout.fillWidth: true
onTextChanged: checkFields() // onTextChanged: checkFields()
} // }
Label // Label
{ // {
text: qsTr("Nr.*") // text: qsTr("Nr.*")
Layout.alignment: Qt.AlignRight | Qt.AlignVCenter // Layout.alignment: Qt.AlignRight | Qt.AlignVCenter
} // }
TextField // TextField
{ // {
property string name: "houseno" // property string name: "houseno"
id: housenoid // id: housenoid
Layout.fillWidth: true // Layout.fillWidth: true
onTextChanged: checkFields() // onTextChanged: checkFields()
validator: RegularExpressionValidator // validator: RegularExpressionValidator
{ // {
regularExpression: /([0-9a-zA-Z\-]{1,6})/ // regularExpression: /([0-9a-zA-Z\-]{1,6})/
} // }
} // }
Label // Label
{ // {
text: qsTr("PLZ") // text: qsTr("PLZ")
Layout.alignment: Qt.AlignRight // Layout.alignment: Qt.AlignRight
} // }
ComboBox // ComboBox
{ // {
property string name: "postcode" // property string name: "postcode"
id: postcode // id: postcode
Layout.fillWidth: true // Layout.fillWidth: true
editable: true // editable: true
onCurrentTextChanged: checkFields() // onCurrentTextChanged: checkFields()
onEditTextChanged: checkFields() // onEditTextChanged: checkFields()
onActivated: currentValue // onActivated: currentValue
model: address_model // model: address_model
textRole: "display" // textRole: "display"
popup.height: 300 // popup.height: 300
currentIndex: -1 // currentIndex: -1
onCurrentIndexChanged: city.currentIndex = postcode.currentIndex // onCurrentIndexChanged: city.currentIndex = postcode.currentIndex
Layout.columnSpan: 3 // Layout.columnSpan: 3
validator: RegularExpressionValidator // validator: RegularExpressionValidator
{ // {
regularExpression: /([0-9]{1,5})/ // regularExpression: /([0-9]{1,5})/
} // }
} // }
Label // Label
{ // {
text: qsTr("Ort") // text: qsTr("Ort")
Layout.alignment: Qt.AlignRight | Qt.AlignVCenter // Layout.alignment: Qt.AlignRight | Qt.AlignVCenter
} // }
ComboBox // ComboBox
{ // {
property string name: "city" // property string name: "city"
id: city // id: city
Layout.fillWidth: true // Layout.fillWidth: true
editable: true // editable: true
onEditTextChanged: checkFields() // onEditTextChanged: checkFields()
onCurrentTextChanged: checkFields() // onCurrentTextChanged: checkFields()
model: address_model // model: address_model
textRole: "city" // textRole: "city"
popup.height: 300 // popup.height: 300
currentIndex: -1 // currentIndex: -1
Layout.columnSpan: 3 // Layout.columnSpan: 3
} // }
Label // Label
{ // {
text: qsTr("Telefon") // text: qsTr("Telefon")
Layout.alignment: Qt.AlignRight | Qt.AlignVCenter // Layout.alignment: Qt.AlignRight | Qt.AlignVCenter
} // }
TextField // TextField
{ // {
property string name: "telephone" // property string name: "telephone"
id: telephone // id: telephone
Layout.fillWidth: true // Layout.fillWidth: true
Layout.columnSpan: 3 // Layout.columnSpan: 3
validator: RegularExpressionValidator // validator: RegularExpressionValidator
{ // {
regularExpression: /([+0-9]{1})([0-9]{1,17})/ // regularExpression: /([+0-9]{1})([0-9]{1,17})/
} // }
} // }
Label // Label
{ // {
text: qsTr("Mobil") // text: qsTr("Mobil")
Layout.alignment: Qt.AlignRight | Qt.AlignVCenter // Layout.alignment: Qt.AlignRight | Qt.AlignVCenter
} // }
TextField // TextField
{ // {
property string name: "cellphone" // property string name: "cellphone"
id: cellphone // id: cellphone
Layout.fillWidth: true // Layout.fillWidth: true
Layout.columnSpan: 3 // Layout.columnSpan: 3
validator: RegularExpressionValidator // validator: RegularExpressionValidator
{ // {
regularExpression: /([+0-9]{1})([0-9]{1,17})/ // regularExpression: /([+0-9]{1})([0-9]{1,17})/
} // }
} // }
Label // Label
{ // {
text: qsTr("E-Mail") // text: qsTr("E-Mail")
Layout.alignment: Qt.AlignRight // Layout.alignment: Qt.AlignRight
} // }
TextField // TextField
{ // {
property string name: "email" // property string name: "email"
id: email // id: email
Layout.fillWidth: true // Layout.fillWidth: true
placeholderText: qsTr("beispiel@domain.de") // placeholderText: qsTr("beispiel@domain.de")
Layout.columnSpan: 3 // Layout.columnSpan: 3
validator: RegularExpressionValidator // validator: RegularExpressionValidator
{ // {
regularExpression: /([\+!#$%&\*\\/\=?\^_`\.{|}\~\-\_0-9A-Za-z]{1,185})@([0-9A-Za-z\.\-\_]{1,64})\.([a-zA-z]{2,5})/ // regularExpression: /([\+!#$%&\*\\/\=?\^_`\.{|}\~\-\_0-9A-Za-z]{1,185})@([0-9A-Za-z\.\-\_]{1,64})\.([a-zA-z]{2,5})/
} // }
} // }
Label // Label
{ // {
text: qsTr("Homepage") // text: qsTr("Homepage")
Layout.alignment: Qt.AlignRight // Layout.alignment: Qt.AlignRight
} // }
TextField // TextField
{ // {
property string name: "homepage" // property string name: "homepage"
id: homepage // id: homepage
Layout.fillWidth: true // Layout.fillWidth: true
Layout.columnSpan: 3 // Layout.columnSpan: 3
placeholderText: "www.oschkarischtverhaftetwegensexy.jinx" // placeholderText: "www.oschkarischtverhaftetwegensexy.jinx"
} // }
Label // Label
{ // {
text: qsTr("Geschäftsführer") // text: qsTr("Geschäftsführer")
Layout.alignment: Qt.AlignRight // Layout.alignment: Qt.AlignRight
} // }
TextField // TextField
{ // {
property string name: "ceo" // property string name: "ceo"
id: ceo // id: ceo
Layout.fillWidth: true // Layout.fillWidth: true
Layout.columnSpan: 3 // Layout.columnSpan: 3
} // }
Label // Label
{ // {
text: qsTr("USt-IdNr") // text: qsTr("USt-IdNr")
Layout.alignment: Qt.AlignRight // Layout.alignment: Qt.AlignRight
} // }
TextField // TextField
{ // {
property string name: "taxno" // property string name: "taxno"
id: taxno // id: taxno
Layout.fillWidth: true // Layout.fillWidth: true
Layout.columnSpan: 3 // Layout.columnSpan: 3
} // }
Label // Label
{ // {
text: qsTr("Typ") // text: qsTr("Typ")
Layout.alignment: Qt.AlignRight // Layout.alignment: Qt.AlignRight
} // }
ComboBox // ComboBox
{ // {
property string name: "typeid" // property string name: "typeid"
id: typeid // id: typeid
Layout.fillWidth: true // Layout.fillWidth: true
editable: false // editable: false
model: business_type // model: business_type
textRole: "display" // textRole: "display"
Layout.columnSpan: 3 // Layout.columnSpan: 3
} // }
Label // Label
{ // {
text: qsTr("Info") // text: qsTr("Info")
Layout.alignment: Qt.AlignRight | Qt.AlignTop // Layout.alignment: Qt.AlignRight | Qt.AlignTop
} // }
ScrollView // ScrollView
{ // {
id: infoView // id: infoView
Layout.fillWidth: true // Layout.fillWidth: true
Layout.preferredHeight: 100 // Layout.preferredHeight: 100
Layout.columnSpan: 3 // Layout.columnSpan: 3
ScrollBar.horizontal: ScrollBar // ScrollBar.horizontal: ScrollBar
{ // {
policy: ScrollBar.AlwaysOn // policy: ScrollBar.AlwaysOn
} // }
TextArea // TextArea
{ // {
property string name: "customerinfo" // property string name: "customerinfo"
id: customerInfo // id: customerInfo
implicitWidth: parent.width // implicitWidth: parent.width
wrapMode: TextEdit.Wrap // wrapMode: TextEdit.Wrap
background: Rectangle // background: Rectangle
{ // {
color: customerInfo.palette.base // color: customerInfo.palette.base
border.color: customerInfo.activeFocus? customerInfo.palette.highlight: customerInfo.palette.base // border.color: customerInfo.activeFocus? customerInfo.palette.highlight: customerInfo.palette.base
} // }
} // }
} // }
function checkBusinessField() // function checkBusinessField()
{ // {
if (!firmenName.text.trim() || !streetid.text.trim()) // if (!firmenName.text.trim() || !streetid.text.trim())
{ // {
return false // return false
} // }
else // else
{ // {
if (!postcode.editText.trim() || !postcode.currentText || !city.editText.trim() || !city.currentText) // if (!postcode.editText.trim() || !postcode.currentText || !city.editText.trim() || !city.currentText)
return false // return false
else // else
return true // return true
} // }
} // }
} // }

View File

@@ -31,7 +31,7 @@ ColumnLayout {
BarButton { BarButton {
ButtonGroup.group: mainNav ButtonGroup.group: mainNav
icon.source: "qrc:/images/UserGroup-Outline.svg" icon.source: "qrc:/images/UserGroup-Outline.svg"
target: "/Gui/CustomersTable.qml" target: "/Gui/Customer/CustomersTable.qml"
text: qsTr("Kunden") text: qsTr("Kunden")
visible: !onSubPage visible: !onSubPage
} }

View File

@@ -18,13 +18,13 @@ ApplicationWindow {
} }
font: Typography.body font: Typography.body
height: Screen.height * .85 height: Screen.desktopAvailableHeight
palette.window: Colors.mantle palette.window: Colors.mantle
palette.placeholderText: Colors.interactive palette.placeholderText: Colors.interactive
palette.text: Colors.foreground palette.text: Colors.foreground
title: "TERO Personal" title: "TERO Personal"
visible: true visible: true
width: Screen.width * .75 width: Screen.desktopAvailableWidth
Component.onCompleted: { Component.onCompleted: {
systray.activated.connect(showWindow); systray.activated.connect(showWindow);

View File

@@ -1,2 +1,3 @@
module gui module gui
Navigation 1.0 Navigation.qml Navigation 1.0 Navigation.qml
AddContact 1.0 AddContact.qml

View File

@@ -19,12 +19,16 @@ class AddressModel(QAbstractListModel):
elif role == PyqcrmDataRoles.CITY_ROLE: elif role == PyqcrmDataRoles.CITY_ROLE:
data = self.__address_data[row][4] data = self.__address_data[row][4]
return data return data
elif role == PyqcrmDataRoles.COUNTRY_ROLE:
data = self.__address_data[row][3]
return data
return None return None
def roleNames(self): def roleNames(self):
return { return {
Qt.DisplayRole: b"display", Qt.DisplayRole: b"display",
PyqcrmDataRoles.CITY_ROLE: b"city", PyqcrmDataRoles.CITY_ROLE: b"city",
PyqcrmDataRoles.COUNTRY_ROLE: b"country"
} }
def setData(self): def setData(self):

View File

@@ -6,5 +6,6 @@ from enum import IntEnum
class PyqcrmDataRoles(IntEnum): class PyqcrmDataRoles(IntEnum):
CITY_ROLE = Qt.UserRole + 100 CITY_ROLE = Qt.UserRole + 100
STREET_IN_POSTCODE = CITY_ROLE + 1 STREET_IN_POSTCODE = CITY_ROLE + 1
COUNTRY_ROLE = CITY_ROLE + 100

View File

@@ -22,6 +22,7 @@ from lib.Printers import Printers
os.environ['QML_XHR_ALLOW_FILE_READ'] = '1' os.environ['QML_XHR_ALLOW_FILE_READ'] = '1'
# [pyqcrm] # [pyqcrm]
# program-name="" # program-name=""
# version= # version=

View File

@@ -0,0 +1,180 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE QtCreatorProject>
<!-- Written by QtCreator 15.0.0, 2025-02-05T15:48:35. -->
<qtcreator>
<data>
<variable>EnvironmentId</variable>
<value type="QByteArray">{6c31db7b-2c94-4111-b0dc-25005cece3f8}</value>
</data>
<data>
<variable>ProjectExplorer.Project.ActiveTarget</variable>
<value type="qlonglong">0</value>
</data>
<data>
<variable>ProjectExplorer.Project.EditorSettings</variable>
<valuemap type="QVariantMap">
<value type="bool" key="EditorConfiguration.AutoIndent">true</value>
<value type="bool" key="EditorConfiguration.AutoSpacesForTabs">false</value>
<value type="bool" key="EditorConfiguration.CamelCaseNavigation">true</value>
<valuemap type="QVariantMap" key="EditorConfiguration.CodeStyle.0">
<value type="QString" key="language">Cpp</value>
<valuemap type="QVariantMap" key="value">
<value type="QByteArray" key="CurrentPreferences">CppGlobal</value>
</valuemap>
</valuemap>
<valuemap type="QVariantMap" key="EditorConfiguration.CodeStyle.1">
<value type="QString" key="language">QmlJS</value>
<valuemap type="QVariantMap" key="value">
<value type="QByteArray" key="CurrentPreferences">QmlJSGlobal</value>
</valuemap>
</valuemap>
<value type="qlonglong" key="EditorConfiguration.CodeStyle.Count">2</value>
<value type="QByteArray" key="EditorConfiguration.Codec">UTF-8</value>
<value type="bool" key="EditorConfiguration.ConstrainTooltips">false</value>
<value type="int" key="EditorConfiguration.IndentSize">4</value>
<value type="bool" key="EditorConfiguration.KeyboardTooltips">false</value>
<value type="int" key="EditorConfiguration.LineEndingBehavior">0</value>
<value type="int" key="EditorConfiguration.MarginColumn">80</value>
<value type="bool" key="EditorConfiguration.MouseHiding">true</value>
<value type="bool" key="EditorConfiguration.MouseNavigation">true</value>
<value type="int" key="EditorConfiguration.PaddingMode">1</value>
<value type="int" key="EditorConfiguration.PreferAfterWhitespaceComments">0</value>
<value type="bool" key="EditorConfiguration.PreferSingleLineComments">false</value>
<value type="bool" key="EditorConfiguration.ScrollWheelZooming">true</value>
<value type="bool" key="EditorConfiguration.ShowMargin">false</value>
<value type="int" key="EditorConfiguration.SmartBackspaceBehavior">2</value>
<value type="bool" key="EditorConfiguration.SmartSelectionChanging">true</value>
<value type="bool" key="EditorConfiguration.SpacesForTabs">true</value>
<value type="int" key="EditorConfiguration.TabKeyBehavior">0</value>
<value type="int" key="EditorConfiguration.TabSize">8</value>
<value type="bool" key="EditorConfiguration.UseGlobal">true</value>
<value type="bool" key="EditorConfiguration.UseIndenter">false</value>
<value type="int" key="EditorConfiguration.Utf8BomBehavior">1</value>
<value type="bool" key="EditorConfiguration.addFinalNewLine">true</value>
<value type="bool" key="EditorConfiguration.cleanIndentation">true</value>
<value type="bool" key="EditorConfiguration.cleanWhitespace">true</value>
<value type="QString" key="EditorConfiguration.ignoreFileTypes">*.md, *.MD, Makefile</value>
<value type="bool" key="EditorConfiguration.inEntireDocument">false</value>
<value type="bool" key="EditorConfiguration.skipTrailingWhitespace">true</value>
<value type="bool" key="EditorConfiguration.tintMarginArea">true</value>
</valuemap>
</data>
<data>
<variable>ProjectExplorer.Project.PluginSettings</variable>
<valuemap type="QVariantMap">
<valuemap type="QVariantMap" key="AutoTest.ActiveFrameworks">
<value type="bool" key="AutoTest.Framework.Boost">true</value>
<value type="bool" key="AutoTest.Framework.CTest">false</value>
<value type="bool" key="AutoTest.Framework.Catch">true</value>
<value type="bool" key="AutoTest.Framework.GTest">true</value>
<value type="bool" key="AutoTest.Framework.QtQuickTest">true</value>
<value type="bool" key="AutoTest.Framework.QtTest">true</value>
</valuemap>
<value type="bool" key="AutoTest.ApplyFilter">false</value>
<valuemap type="QVariantMap" key="AutoTest.CheckStates"/>
<valuelist type="QVariantList" key="AutoTest.PathFilters"/>
<value type="int" key="AutoTest.RunAfterBuild">0</value>
<value type="bool" key="AutoTest.UseGlobal">true</value>
<valuemap type="QVariantMap" key="ClangTools">
<value type="bool" key="ClangTools.AnalyzeOpenFiles">true</value>
<value type="bool" key="ClangTools.BuildBeforeAnalysis">true</value>
<value type="QString" key="ClangTools.DiagnosticConfig">Builtin.DefaultTidyAndClazy</value>
<value type="int" key="ClangTools.ParallelJobs">4</value>
<value type="bool" key="ClangTools.PreferConfigFile">true</value>
<valuelist type="QVariantList" key="ClangTools.SelectedDirs"/>
<valuelist type="QVariantList" key="ClangTools.SelectedFiles"/>
<valuelist type="QVariantList" key="ClangTools.SuppressedDiagnostics"/>
<value type="bool" key="ClangTools.UseGlobalSettings">true</value>
</valuemap>
</valuemap>
</data>
<data>
<variable>ProjectExplorer.Project.Target.0</variable>
<valuemap type="QVariantMap">
<value type="QString" key="DeviceType">Desktop</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Python 3.13.1</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName">Python 3.13.1</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">{bd928902-6673-464d-b976-4a1ba0e13d34}</value>
<value type="qlonglong" key="ProjectExplorer.Target.ActiveBuildConfiguration">0</value>
<value type="qlonglong" key="ProjectExplorer.Target.ActiveDeployConfiguration">0</value>
<value type="qlonglong" key="ProjectExplorer.Target.ActiveRunConfiguration">0</value>
<valuemap type="QVariantMap" key="ProjectExplorer.Target.BuildConfiguration.0">
<value type="QString" key="ProjectExplorer.BuildConfiguration.BuildDirectory">/home/dstoppek/anaconda3/envs/pyqcrm</value>
<valuemap type="QVariantMap" key="ProjectExplorer.BuildConfiguration.BuildStepList.0">
<valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.0">
<value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">Python.PysideBuildStep</value>
<value type="QString" key="Python.PySideProjectTool">/home/dstoppek/anaconda3/envs/pyqcrm/bin/pyside6-project</value>
<value type="QString" key="Python.PySideUic">/home/dstoppek/anaconda3/envs/pyqcrm/bin/pyside6-uic</value>
</valuemap>
<value type="qlonglong" key="ProjectExplorer.BuildStepList.StepsCount">1</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Erstellen</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName">Erstellen</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.BuildSteps.Build</value>
</valuemap>
<valuemap type="QVariantMap" key="ProjectExplorer.BuildConfiguration.BuildStepList.1">
<value type="qlonglong" key="ProjectExplorer.BuildStepList.StepsCount">0</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Bereinigen</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName">Bereinigen</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.BuildSteps.Clean</value>
</valuemap>
<value type="int" key="ProjectExplorer.BuildConfiguration.BuildStepListCount">2</value>
<value type="bool" key="ProjectExplorer.BuildConfiguration.ClearSystemEnvironment">false</value>
<valuelist type="QVariantList" key="ProjectExplorer.BuildConfiguration.CustomParsers"/>
<value type="bool" key="ProjectExplorer.BuildConfiguration.ParseStandardOutput">false</value>
<valuelist type="QVariantList" key="ProjectExplorer.BuildConfiguration.UserEnvironmentChanges"/>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName">Python 3.13.1 virtuelle Umgebung</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">Python.PySideBuildConfiguration</value>
<value type="QString" key="python">/home/dstoppek/anaconda3/envs/pyqcrm/bin/python</value>
<value type="QString" key="venv">/home/dstoppek/anaconda3/envs/pyqcrm</value>
</valuemap>
<value type="qlonglong" key="ProjectExplorer.Target.BuildConfigurationCount">1</value>
<valuemap type="QVariantMap" key="ProjectExplorer.Target.DeployConfiguration.0">
<valuemap type="QVariantMap" key="ProjectExplorer.BuildConfiguration.BuildStepList.0">
<value type="qlonglong" key="ProjectExplorer.BuildStepList.StepsCount">0</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Deployment</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName">Deployment</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.BuildSteps.Deploy</value>
</valuemap>
<value type="int" key="ProjectExplorer.BuildConfiguration.BuildStepListCount">1</value>
<valuemap type="QVariantMap" key="ProjectExplorer.DeployConfiguration.CustomData"/>
<value type="bool" key="ProjectExplorer.DeployConfiguration.CustomDataEnabled">false</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.DefaultDeployConfiguration</value>
</valuemap>
<value type="qlonglong" key="ProjectExplorer.Target.DeployConfigurationCount">1</value>
<valuemap type="QVariantMap" key="ProjectExplorer.Target.RunConfiguration.0">
<value type="bool" key="Analyzer.Perf.Settings.UseGlobalSettings">true</value>
<value type="bool" key="Analyzer.QmlProfiler.Settings.UseGlobalSettings">true</value>
<value type="int" key="Analyzer.Valgrind.Callgrind.CostFormat">0</value>
<value type="bool" key="Analyzer.Valgrind.Settings.UseGlobalSettings">true</value>
<valuelist type="QVariantList" key="CustomOutputParsers"/>
<value type="int" key="PE.EnvironmentAspect.Base">2</value>
<valuelist type="QVariantList" key="PE.EnvironmentAspect.Changes"/>
<value type="bool" key="PE.EnvironmentAspect.PrintOnRun">false</value>
<value type="QString" key="PerfRecordArgsId">-e cpu-cycles --call-graph dwarf,4096 -F 250</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName">main.py</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">PythonEditor.RunConfiguration.</value>
<value type="QString" key="ProjectExplorer.RunConfiguration.BuildKey">/home/dstoppek/Coden/Projekte/pyqcrm/main.py</value>
<value type="bool" key="ProjectExplorer.RunConfiguration.Customized">false</value>
<value type="QString" key="PythonEditor.RunConfiguation.Script">/home/dstoppek/Coden/Projekte/pyqcrm/main.py</value>
<value type="bool" key="RunConfiguration.UseCppDebuggerAuto">true</value>
<value type="bool" key="RunConfiguration.UseQmlDebuggerAuto">true</value>
<value type="QString" key="RunConfiguration.WorkingDirectory.default">/home/dstoppek/Coden/Projekte/pyqcrm</value>
<value type="QString" key="RunConfiguration.X11Forwarding">:0</value>
</valuemap>
<value type="qlonglong" key="ProjectExplorer.Target.RunConfigurationCount">1</value>
</valuemap>
</data>
<data>
<variable>ProjectExplorer.Project.TargetCount</variable>
<value type="qlonglong">1</value>
</data>
<data>
<variable>ProjectExplorer.Project.Updater.FileVersion</variable>
<value type="int">22</value>
</data>
<data>
<variable>Version</variable>
<value type="int">22</value>
</data>
</qtcreator>

View File

@@ -74,7 +74,13 @@
<file>Js/qmldir</file> <file>Js/qmldir</file>
<file>Js/JsLib.js</file> <file>Js/JsLib.js</file>
<file>Js/qmldict.js</file> <file>Js/qmldict.js</file>
<file>TeroStyle/pushtest.qml</file> <file>Gui/Customer/AddCustomer.qml</file>
<file>Gui/Customer/CustomerContactDetails.qml</file>
<file>Gui/Customer/CustomerDetails.qml</file>
<file>Gui/Customer/CustomerDetailsView.qml</file>
<file>Gui/Customer/CustomersTable.qml</file>
<file>Gui/Customer/CustomerView.qml</file>
<file>Gui/Customer/qmldir</file>
</qresource> </qresource>
<qresource prefix="/TeroStyle"/> <qresource prefix="/TeroStyle"/>
</RCC> </RCC>

View File

@@ -7,3 +7,5 @@ mariadb
soundfile soundfile
sounddevice sounddevice
reportlab reportlab
tomlkit
bcrypt