Все технические форумы на одном сайте Удобный поиск информации с популярных форумов в одном месте
Вопрос: Передать класс в QML при запуске приложения

Здравствуйте. Мне нужно передать в QML класс (в моем случае с настройками), до того, как будет загружен main.qml

Сейчас работает так:
main.cpp:
C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
int main(int argc, char *argv[]){
    QCoreApplication::setAttribute(Qt::AA_EnableHighDpiScaling);
    QGuiApplication app(argc, argv);
    QQuickStyle::setStyle("Material");
 
    QQmlApplicationEngine engine;
    engine.load(QUrl(QLatin1String("qrc:/main.qml")));
 
    QObject *root = engine.rootObjects()[0];
    QQmlContext *rootContext = engine.rootContext();
    appSettings *settings = new appSettings(root);
    signalHandler *handler = new signalHandler(root, rootContext, settings);
 
    rootContext->setContextProperty("appSettings", settings); //[I]Место добавления нужного класса[/I]
    
    //Остальные классы
    qmlRegisterUncreatableType<servoListModel>("dataModels", 1, 0, "ServoListModel", "can't create servo list");
    qmlRegisterUncreatableType<engineListModel>("dataModels", 1, 0, "EngineListModel", "can't create engine list");
    qmlRegisterUncreatableType<bluetoothModel>("dataModels", 1, 0, "BluetoothModel", "can't create bluetooth list");
 
    //Сигналы и прочее
 
    return app.exec();
}
Часть main.qml:
Javascript
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
ApplicationWindow {
    id: mainWindow
 
    width: 640;
    height: 480;
    visible: true;
    title: "Имя программы"
    
    //То, что должно подгружаться из настроек:
    Material.theme: appSettings.theme
    Material.primary: appSettings.mainColor
    Material.accent: appSettings.accentColor
 
    property bool isTablet: width > height ? true : false
    property int keyboardHeight: Qt.inputMethod.keyboardRectangle.height / Screen.devicePixelRatio
    
    //Сигналы
 
    //Функции
 
    StackView{
        id: mainStack
        objectName: "mainStack"
   
    //Параметры
 
        anchors.fill: parent
 
        focus: true
        onCurrentItemChanged: currentItem ? currentItem.forceActiveFocus() : console.log("null object")
 
        initialItem: SelectConnectTypePage {}
 
    }
}
В таком варианте настройки не подхватываются при старте до тех пор, пока не будут изменены.
Если переделать main.cpp, так чтобы main.qml загружался позже:
C++ (Qt)
1
2
3
4
5
6
7
8
9
    QQmlApplicationEngine engine;
     
    QObject *root = engine.rootObjects()[0]; [B]//В таком случае падает здесь[/B]
    QQmlContext *rootContext = engine.rootContext();
    appSettings *settings = new appSettings(root);
    signalHandler *handler = new signalHandler(root, rootContext, settings); 
    rootContext->setContextProperty("appSettings", settings); //[I]Место добавления нужного класса[/I]
 
    engine.load(QUrl(QLatin1String("qrc:/main.qml")));
То в таком варианте программа падает на старте (строку падения выделил) с таким выхлопом в консоль:
Код
Запускается C:\Qt\Projects\build-ARC-Desktop_Qt_5_7_1_MinGW_32bit-Debug\debug\ARC.exe...
QML debugging is enabled. Only use this in a safe environment.
ASSERT failure in QList<T>::operator[]: "index out of range", file ..\..\5.7\mingw53_32\include/QtCore/qlist.h, line 545
C:\Qt\Projects\build-ARC-Desktop_Qt_5_7_1_MinGW_32bit-Debug\debug\ARC.exe завершился с кодом 3
Как можно решить эту проблему?
Ответ:
Сообщение от Mixxxxa
Все сигналы/слоты проходят через С++ класс (signalHandler), который передает команды других модулям и следит за их выполнением (такой вот переходник).
Обычно всё, что связано с QML из QML должно быть доступно. Не помню у себя ни одной программы где бы это было не так. Если вы начнёте работать в обход QML, то начнут появляться крайне неудобные грабли и углы, потому что QML на подобную работу не рассчитан.
Вопрос: Partial-классы

Если у меня есть partial-класс A и два .cs файлика, на которые он разбит, то как каждый из них называть? (Если это был бы не partial-класс, то я бы назвал файлик как A.cs.)
Ответ: Обычно именуют по функционалу или причине разбивания.
Пример первого - *.Designer.cs в винформах, где * - имя класса-формы.
Второй лично я практикую, если у меня есть вложенный класс, который я хочу вынести в отдельный файл. В этом случае я либо ставлю префикс с именем родителя, либо просто даю имя вложенного файла:
C#
1
2
3
4
5
6
7
8
9
10
11
// Foo.cs
partial class Foo
{
   ...
}
 
// Foo.Bar.cs или просто Bar.cs
partial class Foo
{ 
   private class Bar { }
}
Определите причину, по которой вы делаете класс partial и отражайте ее в имени файла.
Вопрос: "Ссылка на класс"

Добрый день, надо передать аргументом класс, что-бы потом использовать конструктор из него.
Возможно-ли это? Мне надо с класса А передать классу Б аргумент (класс), что-бы потом создать объект и использовать его.

Например gun(bullet.class);
А в gun использовать конструктор из bullet.class
Ответ: Как создать объект обсуждалось здесь.
Создать экземпляр класса

В вашем случае опускается этап поиска класса по названию, ссылку на объект, описывающий ваш класс, получаете одним из следующих способов:
1. Через экземпляр класса: gun(bullet.getClass());
2. Через имя класса: gun(Bullet.class);

Метод на вход должен принимать объект типа 'java.lang.Class'.
Вопрос: Передать класс в аргументе метода

Делаю класс который представляет из себя коллекцию объектов произвольного типа в виде List<Object> . Хочу что бы из его можно было извлечь нужный объект по имени класса. Например так.
Java(TM) 2 Platform Standard Edition 5.0
1
String str = objectCollection.get(String.class);
Собственно в методе get идет трассирующий instanceof по всем объектам в списке и возврат первого совпадения.
Java(TM) 2 Platform Standard Edition 5.0
1
2
3
4
5
for (int i = 0; i < list.size(); i++) {
                if (list.get(i) instanceof cls) {
                     return list.get(i);
                }
}
Я не понимаю как передать в метод класс, принадлежность к которому я хочу проверять (и вообще возможно ли). Как это сделать и будет ли сравнение верно при том условии что все объекта хранятся как Object? Плюс вот еще что. Я хочу сделать универсальный класс возврата нескольких объектов из метода. Метод возвращает ObjectCollecton, а дальше любой другой объект извлекается из его через objectCollction.get(Class.class) . У меня есть такое подозрение что я изобретаю велосипед из-за недостаточных знаний языка, есть ли дефолтное решение задачи?
Ответ: если я правильно понял задачу
и даже не уверен что это хорошее решение, может отцы зайдут покритикуют
Java(TM) 2 Platform Standard Edition 5.0
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
public class Something {
 
    public static void main(String[] args) {
        Wrapper w = new Wrapper();
        w.put("String 1");
        w.put("String 2");
        w.put(42);
        w.put("String 3");
 
        ArrayList<Integer> elements = w.getElements(Integer.class);
        System.out.println(elements.size()); // 1
        //
        ArrayList<String> stringArrayList = w.getElements(String.class);
        System.out.println(stringArrayList.size()); // 3
 
    }
}
 
class Wrapper {
    private List<Object> list = new ArrayList<>();
 
    public void put(Object object) {
        list.add(object);
    }
 
    public <T> ArrayList<T> getElements(Class<T> clazz) {
        ArrayList<T> objects = new ArrayList<>();
        for (Object o : list) {
            if (o.getClass().equals(clazz)) objects.add((T) o);
        }
        return objects;
    }
}
Вопрос: Как передать класс (не объект) в процедуру

Здравствуйте.
Хотел реализовать процедуру и уперся в вызов статического метода класса.
Код примерно такой:
if not Assigned(frmLists)
then
begin
frmLists:=TfrmLists.Create(Application);
LoadFormParamsFromReg(frmLists, SoftKey, True);
end;
frmLists.ShowModal;
FreeAndNil(frmLists);

Ну объект frmLists передать не проблема. Но как реализовать frmLists:=TfrmLists.Create(Application);? Методы Create у разных форм разные.
Может я не с той стороны подхожу?
Ответ:
Ага, и это больше всего бесит, когда только начинаешь разбираться и бьешься об стену лбом
Вопрос: Передача данных в Partial

Добрый день.
У меня есть страница, имеющая ViewBag. Т.е. я спокойно вывожу элементы на ней
Код C#
1
2
3
4
@foreach (var b in ViewBag.Elements)
            {
@b.element
}
Подключил Partial. Как мне передать в него элемент, что бы уже в нем был этот @b.element ?
А во вьюхе уже реализовать
Код C#
1
2
3
4
@foreach (var b in ViewBag.Elements)
            {
@Html.Partial(....)
}
Спасибо.

Добавлено через 17 минут
Или Partial и так видит ViewBag.Elements ?

Добавлено через 2 минуты
В общем хочу var b передавать в Partial...

Добавлено через 2 минуты
Все, решил. Partial и так видит ViewBag.Elements

Добавлено через 26 минут
Нет, сделал так
Код C#
1
2
3
4
@foreach (var b in ViewBag.Items)
                            {
                                @Html.Partial("_TaskWrap")
                            }
В самом партиале ошибка на строке Foreach
Код C#
1
2
3
4
5
6
@ViewBag IEnumerable<var>  
 
@foreach (var b in ViewBag)
{ 
   <p>@b.Name</p>
}
Что я не так делаю?

Добавлено через 2 минуты
Т.е. хочу в партиал передавать элемент, а уже в нем отображать данные элемента.
Ответ:
Сообщение от Костяныч
а как сделать что бы партиал не был привязан к определенной модели?
можно пердавать что-то плана:
Код C#
1
2
3
4
class Item<T>
{
 public T Content { get; set; }
}
Но я хз, как вы это будете обрабатывать на стороне Partial
Вопрос: Partial class, наследование, конструктор копии

Есть сервер и клиент
класс на сервере
public class Order
{
   //какие то данные
   public static void SaveToFile(Order Ord, string FileName)
   {
      //сериализация
   }
   public static Order LoadFromFile(string FileName)
   {
      //десериализация
   }
{
}

теперь на клиенте нужен такой же класс но для него необходимы дополнительные методы для взаимодействия с пользователем и сервером и static члены.
Как понимаю partial в разных сборках нельзя.
Делаю наследование.
public class OrderClient:Order
{
   //какие то static данные
   //какие то методы
   public static void SaveToFile(OrderClient Ord, string FileName)
   {
      //тут всё просто
     Order.SaveToFile(Ord, FileName);
   }
   public static OrderClient LoadFromFile(string FileName)
   {
      //ааа что делать тут???
   }
}


вариант сделать конструктор, и конструктор копии для базового класса
   public OrderClient(Order Ord):Base(Ord)
   {
   }


Далее начинаю разбираться с конструктором копии для базового класса, натыкаюсь на
Object MemberwiseClone()
и понимаю я попал, единственный путь вручную самостоятельно делать конструктор копии.

Вопрос.
Я всё правильно описал или где то ошибся?
Есть ли ошибка в выбранной архитектуре?
Ответ:
petalvik
...

Мой вариант вообще не прокатил с ошибкой при сериализации.
А вот с генериком сработал, спасибо!
Вопрос: Ошибка компиляции при partial

Всем привет! При компиляции программы с частичными классами выдаёт ошибку cs0246. Вот код:
1 partical
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
 
namespace Classes
{
    partial class partClass
    {
        public void Part1()
        {
            Console.WriteLine("1 Part");
        }
    }
}
2 partical
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
 
namespace Classes
{
    partial class partClass
    {
        public void Part2()
        {
            Console.WriteLine("2 part");
 
        }
    }
}
Главная часть программы
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
 
namespace partical
{
    class Program
    {
        static void Main(string[] args)
        {
            partClass instance = new partClass();
 
            instance.Part1();
            instance.Part2();
 
            Console.ReadKey();
 
        }
    }
}
Ответ: denisario, классы Program и partClass в разных пространствах имён (namespace). Поэтому они друг друга не видят.
Вопрос: AJAX: Вместо добавления выдает partial view

Что не пробовал,место добавления, просто выкидывает partial view
основная страница
Код C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
 
@using EntityClassNS
@model  IList<CarManufacturer>
@{
    //Layout = "~/Views/Shared/_MasterPage.cshtml";
    AjaxOptions ajaxOpts = new AjaxOptions
    {
        UpdateTargetId = "CarsSearchResults"
    };
} 
<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8" />
    <meta name="viewport" content="width=device-width" />
    <title>Страница</title>
    @Styles.Render("~/Content/css")
    @Scripts.Render("~/scripts/jquery-2.1.3.js")
    @Scripts.Render("~/scripts/jquery.unobtrusive-ajax.js")
    @Scripts.Render("~/bundles/modernizr")
</head>
<body>
    @using (Ajax.BeginForm("CarsSearchFunc", ajaxOpts))
    {
            @Html.DropDownList("ManfList"
                             , new SelectList(Model, "Id", "ManufacturerName")
                             , new { onchange = "submit()" })
    }
 
<div id="CarsSearchResults">
</div>
</body>
</html>
партиал
Код C#
1
2
3
4
@using EntityClassNS
@model SelectList
 
@Html.DropDownList("CarsList",Model)
и код на контролере
Код C#
1
2
3
4
5
6
7
        public ActionResult CarsSearchFunc(int ManfList)
        {
            CarCenterEntities DB = new CarCenterEntities();
            return PartialView("CarsPartial",
                                new SelectList(DB.Car.Where(C => C.CarManufacturerId == ManfList).ToList()
                                , "Id", "CarName"));
        }
Ответ: Возможен вариант, что скрипт не подключен

http://habrahabr.ru/post/180011/

Код C#
1
2
3
4
5
6
7
8
9
10
@using (Ajax.BeginForm("AddComment", new AjaxOptions
                                         {
                                           Url = Url.Action("AddCommentAjax"),
                                           OnSuccess = "OnSuccessComment",
                                           HttpMethod = "POST"
                                         }))
{
    @Html.TextArea("comment")
    <input type="submit" value="Добавить комментарий"/>
}
Мы видим, что отличие от @using (Html.BeginForm("AddComment", "Home")) заключается только в дополнительных data- атрибутах. Иными словами, для отключенного Javascript форма будет отравляться на public ActionResult AddComment(string comment). Когда же JavaScript включен, адаптер считывает данные с data- атрибутов, перехватывает отправку формы и делает запрос на public ActionResult AddCommentAjax(string comment). Успешный результат мы получаем в виде переданного JSON и обрабатываем в указанной js функции OnSuccessComment.
Вопрос: Partial с методами

Возник вопрос по поводу разделения описания и определения методов. partial накладывает ограничения на видимость методов(только частный) и тип возвращаемых данных. Есть ли какой-либо способ разделять описания и реализацию как в С++, без потерь?
Ответ:
Сообщение от dmitriy____
Если бы были разнесены реализация и объявления, то это читалось бы гораздо легче.
Для легкости чтения используйте #region.

А вообще, если в классе 15 полей и 20 методов — не слишком ли много этот класс на себя берет?