Помощь новичку



  • не пойму в чем ошибка, помогите кому не трудно
    (скорее всего ошибка в написании\ применении класса майвиджет)

    Запускается D:\qt\projS\build-ComboCounter-Desktop_Qt_5_0_2_MinGW_32bit-Debug\debug\ComboCounter...
    QWidget: Must construct a QApplication before a QPaintDevice
    Invalid parameter passed to C runtime function.
    Invalid parameter passed to C runtime function.
    Error - RtlWerpReportException failed with status code :-1073741823. Will try to launch the process directly
    D:\qt\projS\build-ComboCounter-Desktop_Qt_5_0_2_MinGW_32bit-Debug\debug\ComboCounter завершился с кодом 3

    combocounter.h
    @
    #ifndef COMBOCOUNTER_H
    #define COMBOCOUNTER_H

    #include <QMainWindow>
    #include <QObject>

    namespace Ui {
    class counter;
    }

    class combocounter : public QObject
    {
    Q_OBJECT
    private:
    int Value;

    public:
    combocounter();
    public slots:
    void slotInc();

    signals:
    void goodbye ();
    void counterChanged(int);

    };

    #endif // COMBOCOUNTER_H
    @
    MyWidget.h
    @
    #ifndef MYWIDGET_H
    #define MYWIDGET_H

    #include <QWidget>
    #include <QComboBox>

    class MyWidget: public QWidget
    {
    Q_OBJECT

    public:
    MyWidget (QWidget* _parent = 0);

    private slots:
    void mySlot (QString _text);

    private:
    QComboBox *cmb;

    };
    #endif // MYWIDGET_H
    @
    combocounter.cpp
    @
    #include "combocounter.h"

    combocounter::combocounter() :
    QObject()
    ,Value(0)

    {

    }

    void combocounter::slotInc()
    {
    emit counterChanged(++Value) ;
    }

    @
    main.cpp
    @
    #include "combocounter.h"
    #include "MyWidget.h"
    #include <QApplication>
    #include <QLayout>
    #include <QPushButton>
    #include <QComboBox>
    #include <QDIal>
    #include <QTimeEdit>
    #include <QSpinBox>
    #include <QTimer>
    #include <QListWidget>
    #include <QLabel>

    int main(int argc, char argv[])
    {
    QApplication a(argc, argv);
    QWidget w;
    QComboBox
    cmb = new QComboBox;
    QPushButton* btn = new QPushButton("Добавить");

    QDial* dial = new QDial;
    QTimeEdit* time = new QTimeEdit;
    QSpinBox* spb = new QSpinBox;
    
    QLabel* lbl = new QLabel("AAA");
    
    
    QTimer* timer = new QTimer;
    timer->start(1000);
    

    //combobox items
    cmb->addItem("Counter1");
    cmb->addItem("Counter2");
    cmb->addItem("Counter3");
    //hidding
    dial->hide();
    time->hide();
    spb->hide();

    if (lbl->text() == "Counter1") {
           QObject::connect(btn, SIGNAL(clicked()),
                            dial, SLOT (show())
                           );
            }
    
    
    if (cmb->currentText() == "Counter2") {
         QObject::connect(btn, SIGNAL(clicked()),
                          time, SLOT (show())
                         );
    
        }
    
     if (cmb->currentText() == "Counter3") {
         QObject::connect(btn, SIGNAL(clicked()),
                          spb, SLOT (show())
                         );
        }
    

    //dial start
    combocounter counter1;

    QObject::connect(timer, SIGNAL(timeout()),
                     &counter1, SLOT (slotInc())
            );
    QObject::connect(&counter1, SIGNAL(counterChanged(int)),
                     dial, SLOT (setValue(int))
            );
    

    //timeedit start
    combocounter counter2;

    QObject::connect(timer, SIGNAL(timeout()),
                     &counter2, SLOT (slotInc())
            );
    QObject::connect(&counter2, SIGNAL(counterChanged(int)),
                     time, SLOT (stepUp())
            );
    

    //spinbox start
    combocounter counter3;

    QObject::connect(timer, SIGNAL(timeout()),
                     &counter3, SLOT (slotInc())
            );
    QObject::connect(&counter3, SIGNAL(counterChanged(int)),
                     spb, SLOT (setValue(int))
            );
    
    
    //Layout setup
     QVBoxLayout* lay = new QVBoxLayout;
     lay->addWidget(cmb);
     lay->addWidget(btn);
     lay->addStretch(1);
     lay->addWidget(dial);
     lay->addWidget(time);
     lay->addWidget(spb);
     lay->addWidget(lbl);
     lay->setMargin(30);
     lay->setSpacing(15);
    
     w.setLayout (lay);
    
    
    
    w.resize(200,360);
    w.show();
    
    return a.exec&#40;&#41;;
    }
    

    @
    MyWidget.cpp
    @
    #include "MyWidget.h"
    #include <QComboBox>
    #include <QLabel>
    #include <QDial>
    #include <QLabel>
    #include <QPushButton>

    QPushButton* btn = new QPushButton("Добавить");

    QDial* dial = new QDial;

    QLabel* lbl = new QLabel("AAA");

    MyWidget::MyWidget (QWidget* _parent): QWidget (_parent)
    {
    cmb = new QComboBox (this);

    connect(cmb, SIGNAL(currentTextChanged(QString)),
    this, SLOT (mySlot(QString)));
    }

    void MyWidget::mySlot(QString _text)
    {
    lbl->setText (_text);
    if (_text == "dial")
    connect(btn, SIGNAL(clicked()),
    dial, SLOT (show()));
    }
    @



  • Добрый день!
    Если удалите строки
    @QPushButton* btn = new QPushButton("Добавить");
    QDial* dial = new QDial;
    QLabel* lbl = new QLabel("AAA");@
    из файла MyWidget.cpp ваша программа запустится.
    Но насколько я понял ваш замысел, программа не будет делать что вы хотите, она вообще ничего не будет делать.

    1. Класс MyWidget ни где не используется.
    2. Строки :
      @ if (lbl->text() == "Counter1") {
      QObject::connect(btn, SIGNAL(clicked()),
      dial, SLOT (show())
      );
      }
    if (cmb->currentText() == "Counter2") {
         QObject::connect(btn, SIGNAL(clicked()),
                          time, SLOT (show())
                         );
    
        }
    
     if (cmb->currentText() == "Counter3") {
         QObject::connect(btn, SIGNAL(clicked()),
                          spb, SLOT (show())
                         );
        }@
    

    не делают ничего полезного.

    Объясните что именно вы собираетесь получить в итоге, постараюсь объяснить с какой стороны подходить.



  • спасибо что так серьезно отнеслись к вопросу)
    но теперь пишет что они не заданы
    "D:\qt\projS\ComboCounter\mywidget.cpp:22: ошибка: 'lbl' was not declared in this scope"
    лбл не обьявлено, может это в мейне учесть нужно?

    я хочу далее применить этот класс для того что бы делать видимыми виджеты (они "хайд") при :
    (выборе соотв "каунтера№" и нажатии кнопки "добавить")

    мне объяснили что без такого класса это невозможно, и правда, у меня не получалось.
    Буду очень благодарен если подскажите как правильно теперь его применить в мейне



  • Я не понял пока, что вы хотите сделать, но для того, чтобы программа компилировалась, нужно задекларировать lbl внутри класса MyWidget (в MyWidget.h):

    @
    private:
    QComboBox cmb;
    QLabel
    lbl;@

    Вероятно также, что в Main.cpp вы хотели создать переменную вашего класса MyWidget, а не QWidget.
    Кроме этого, я советую весь код, относящийся к созданию окна программы (создание и расположение компонент, соединение сигналов внутри окна и т.д.) переместить из main в конструктор класса MyWidget.



  • @
    private:
    QComboBox cmb;
    QLabel
    lbl;
    @
    добавил, да , этого не хватало
    из мейна перемещу позже
    главная моя проблема:
    я хочу что бы при выборе в комбобоксе "счетчик№2" и дальнейшем нажатии пользователем кнопки "добавить" - добавлялся "виджет№2"
    я как новичек(как я это вижу), делаю это так:
    1й класс - работа счетчиков ( это сделал, все ок)
    2й класс(майвиджет) - сигнально-слотовая реализация
    @
    connect(cmb, SIGNAL(currentTextChanged(QString)),
    this, SLOT (mySlot(QString)));
    }

    void MyWidget::mySlot(QString _text)
    {
    lbl->setText (_text);
    if (_text == "Counter1")
    connect(btn, SIGNAL(clicked()),
    dial, SLOT (show()));
    }
    @
    теперь подскажите как это все до ума довести, как применить этот классс в мейне? допишите недостающие строки



  • Если честно, то для того, чтобы эту программу довести до ума, её придётся полностью переписать. Вы хотите, чтобы при выборе какого-либо пункта из списка выводился соответствующий виджет, заменяя предыдущий? Если да, то не лучше ли использовать что-нибудь стандартное, например QStacketWidget. Посмотрите на "Config Dialog Example":https://qt-project.org/doc/qt-5.0/qtwidgets/dialogs-configdialog.html. Там делается именно это, только QListWidget вам надо будет заменить на QComboBox. Заодно можно поучиться, как следует организовать свой код. Если будут вопросы, задавайте.



  • я готов переделать полностью, если это точно поможет =)
    не совсем так, щас попробую понятнее уясниться :
    пользователь выбирает из комбобокса требуемый ему вид счетчика, после чего нажимает кнопку "добавить" в результате чего внизу формы появляется счетчик выбраного вида
    (потом работа с четчиков, я с ними почти разобрался)
    далее добавл. функции при нажатии ПК по счетчику (одна из них удалить)
    а потом: при удалении обнулить , и сместить все последующие счетчики вверх на освободившееся место.
    то есть подразумиваеться что их может быть несколько,

    в этом случае поможет ли указанный вами класс?



  • Значит ли это, что вы хотите иметь список из нескольких счётчиков (возможно, одинакового вида), одновременно видимых в окне? Если да, то QStacketWidget не подойдёт. В этом случае ответ зависит от того, сколько таких счётчиков может быть выведено на экран и от того, можно ли вставлять более одного счётчика какого-то номера. Если два-три, и при этом они имеют только уникальный тип, то будет оправдано их просто вставлять в окно.

    Если их может быть много, да ещё по нескольку одного типа (если я несколько раз выберу №1 и добавлю его), тогда нужно использовать что-то вроде QListWidget и добавлять туда элементы QListWidgetItem. Если вас устроит иметь только строку текста и/или значок в каждом таком пункте, обозначающем ваш счётчик, можно воспользоваться уже готовыми классами. Если вам нужно выводить что-то более сложное (например, кнопки), придётся писать свой вариант QListWidgetItem. Для начала я бы попробовал написать черновик с добавлением и удалением стандартных элементов.

    Пример, который я приводил раньше может быть полезен, т.к. там используется QListWidget. Ещё можно посмотреть "вот сюда":http://codeprogress.com/cpp/libraries/qt/qtClasses.php?item=QListWidget. Там есть более простые примеры.



  • Значит ли это, что вы хотите иметь список из нескольких счётчиков (возможно, одинакового вида), одновременно видимых в окне?
    -да, такое может быть ( но о возможности одинаковых ничего не указано, скорее всего без повторений)

    -счетчиков сколько угодно мне (планирую 3), без повторений

    (думаю попробовать вариант попроще с QStacketWidget)
    так же уделю внимание вашему примеру ниже
    спасибо



  • QStacketWidget здесь не подойдёт, поскольку вы хотите выводить счётчики одновременно, а этот класс показывает только один виджет из нескольких. Если вы хотите ограничиться всего несколькими счётчиками без повоторений, то можно их непосредственно вставлять в окно. Но тогда вам надо решить, что делать, когда пользователь несколько раз выберет один элемент и попытается его добавить. Возможный вариант — каждый раз при добавлении счётчика удалять или делать невыбираемой соответствующую запись в комбо, и добавлять при удалении. Или вообще вместо комбо использовать группу QCheckBox, чтобы этого избежать.

    Напишите сначала эту часть кода, использующую один единственный сигнал, сообщающий об изменении индекса комбо (currentIndexChanged(int index)), соединённый с одним единственным методом (слотом) вашего виджета (MyWidget : public QWidget), который этот новый индекс будет использовать. Для начала это может быть пустая функция. Потом можно будет дописать добавление и удаление счётчиков любым способом.



  • Можно добавлять новые виджеты в QGridLayout, при этом можно отображать сколько угодно виджетов одного вида. А при их удалении они удаляться из таблицы и виджеты смстяться как вы и хотели. :-)


Log in to reply
 

Looks like your connection to Qt Forum was lost, please wait while we try to reconnect.