[QT] QWidget - od razu po pojawieniu się - znika

0

includes/form_acfg.cpp:

#include "includes/form_acfg.h"
#include "ui_form_acfg.h"

form_acfg::form_acfg(QWidget *parent) : QWidget(parent), m_ui(new Ui::form_acfg)
{
    m_ui->setupUi(this);

    //Enable/Disable time settings by checkbox
    connect(m_ui->checkbox_unlimited_time,SIGNAL(toggled(bool)),m_ui->slider_time,SLOT(setEnabled(bool)));
    connect(m_ui->checkbox_unlimited_time,SIGNAL(toggled(bool)),m_ui->spinbox_time,SLOT(setEnabled(bool)));

    //Join values of slider and spinbox
    connect(m_ui->slider_time,SIGNAL(valueChanged(int)),m_ui->spinbox_time,SLOT(setValue(int)));
    connect(m_ui->spinbox_time,SIGNAL(valueChanged(int)),m_ui->slider_time,SLOT(setValue(int)));
}

form_acfg::~form_acfg()
{
    delete m_ui;
}

void form_acfg::changeEvent(QEvent *e)
{
    QWidget::changeEvent(e);
    switch (e->type()) {
    case QEvent::LanguageChange:
        m_ui->retranslateUi(this);
        break;
    default:
        break;
    }
}

incldes/form_acfg.h:

#ifndef FORM_ACFG_H
#define FORM_ACFG_H

#include <QtGui/QWidget>

namespace Ui {
    class form_acfg;
}

class form_acfg : public QWidget {
    Q_OBJECT
public:
    form_acfg(QWidget *parent = 0);
    ~form_acfg();

protected:
    void changeEvent(QEvent *e);

private:
    Ui::form_acfg *m_ui;

private slots:

};

#endif // FORM_ACFG_H

ui_form_acfg.h:

/********************************************************************************
** Form generated from reading ui file 'form_acfg.ui'
**
** Created: Thu 26. Nov 21:56:19 2009
**      by: Qt User Interface Compiler version 4.5.3
**
** WARNING! All changes made in this file will be lost when recompiling ui file!
********************************************************************************/

#ifndef UI_FORM_ACFG_H
#define UI_FORM_ACFG_H

#include <QtCore/QVariant>
#include <QtGui/QAction>
#include <QtGui/QApplication>
#include <QtGui/QButtonGroup>
#include <QtGui/QCheckBox>
#include <QtGui/QGroupBox>
#include <QtGui/QHeaderView>
#include <QtGui/QPushButton>
#include <QtGui/QSlider>
#include <QtGui/QSpinBox>
#include <QtGui/QWidget>

QT_BEGIN_NAMESPACE

class Ui_form_acfg
{
public:
    QGroupBox *gorup_action;
    QPushButton *button_save;
    QPushButton *button_cancel;
    QGroupBox *group_time;
    QSlider *slider_time;
    QCheckBox *checkbox_unlimited_time;
    QSpinBox *spinbox_time;
    QGroupBox *group_main;
    QCheckBox *checkbox_lock_restart;

    void setupUi(QWidget *form_acfg)
    {
        if (form_acfg->objectName().isEmpty())
            form_acfg->setObjectName(QString::fromUtf8("form_acfg"));
        form_acfg->resize(600, 250);
        gorup_action = new QGroupBox(form_acfg);
        gorup_action->setObjectName(QString::fromUtf8("gorup_action"));
        gorup_action->setGeometry(QRect(10, 190, 571, 51));
        button_save = new QPushButton(gorup_action);
        button_save->setObjectName(QString::fromUtf8("button_save"));
        button_save->setGeometry(QRect(190, 20, 75, 23));
        button_cancel = new QPushButton(gorup_action);
        button_cancel->setObjectName(QString::fromUtf8("button_cancel"));
        button_cancel->setGeometry(QRect(310, 20, 81, 23));
        group_time = new QGroupBox(form_acfg);
        group_time->setObjectName(QString::fromUtf8("group_time"));
        group_time->setGeometry(QRect(10, 70, 571, 111));
        slider_time = new QSlider(group_time);
        slider_time->setObjectName(QString::fromUtf8("slider_time"));
        slider_time->setGeometry(QRect(20, 80, 531, 19));
        slider_time->setMinimum(1);
        slider_time->setMaximum(900);
        slider_time->setSliderPosition(1);
        slider_time->setOrientation(Qt::Horizontal);
        checkbox_unlimited_time = new QCheckBox(group_time);
        checkbox_unlimited_time->setObjectName(QString::fromUtf8("checkbox_unlimited_time"));
        checkbox_unlimited_time->setGeometry(QRect(20, 20, 141, 18));
        spinbox_time = new QSpinBox(group_time);
        spinbox_time->setObjectName(QString::fromUtf8("spinbox_time"));
        spinbox_time->setGeometry(QRect(20, 50, 61, 22));
        spinbox_time->setMinimum(1);
        spinbox_time->setMaximum(900);
        group_main = new QGroupBox(form_acfg);
        group_main->setObjectName(QString::fromUtf8("group_main"));
        group_main->setGeometry(QRect(10, 10, 571, 51));
        checkbox_lock_restart = new QCheckBox(group_main);
        checkbox_lock_restart->setObjectName(QString::fromUtf8("checkbox_lock_restart"));
        checkbox_lock_restart->setGeometry(QRect(20, 20, 171, 18));
        checkbox_lock_restart->setIconSize(QSize(16, 16));
        checkbox_lock_restart->setCheckable(true);

        retranslateUi(form_acfg);

        QMetaObject::connectSlotsByName(form_acfg);
    } // setupUi

    void retranslateUi(QWidget *form_acfg)
    {
        form_acfg->setWindowTitle(QApplication::translate("form_acfg", "Form", 0, QApplication::UnicodeUTF8));
        gorup_action->setTitle(QApplication::translate("form_acfg", "Akcja", 0, QApplication::UnicodeUTF8));
        button_save->setText(QApplication::translate("form_acfg", "Zapisz", 0, QApplication::UnicodeUTF8));
        button_cancel->setText(QApplication::translate("form_acfg", "Anuluj", 0, QApplication::UnicodeUTF8));
        group_time->setTitle(QApplication::translate("form_acfg", "Czas na udzielenie odpowiedzi (sekundy)", 0, QApplication::UnicodeUTF8));
        checkbox_unlimited_time->setText(QApplication::translate("form_acfg", "Nieograniczony czas", 0, QApplication::UnicodeUTF8));
        group_main->setTitle(QApplication::translate("form_acfg", "G\305\202\303\263wne", 0, QApplication::UnicodeUTF8));
        checkbox_lock_restart->setText(QApplication::translate("form_acfg", "Zablokuj resetowanie danych", 0, QApplication::UnicodeUTF8));
        Q_UNUSED(form_acfg);
    } // retranslateUi

};

namespace Ui {
    class form_acfg: public Ui_form_acfg {};
} // namespace Ui

QT_END_NAMESPACE

#endif // UI_FORM_ACFG_H

mainwindow.cpp:

#include <QSettings>
#include <QtCore/QVariant>
#include <QtGui/QAction>
#include <QtGui/QApplication>
#include <QtGui/QButtonGroup>
#include <QtGui/QCheckBox>
#include <QtGui/QGroupBox>
#include <QtGui/QHeaderView>
#include <QtGui/QPushButton>
#include <QtGui/QSlider>
#include <QtGui/QSpinBox>
#include <QtGui/QWidget>
#include <QMessageBox>

#include "mainwindow.h"
#include "ui_mainwindow.h"

#include "includes/form_acfg.cpp"

MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    connect(ui->action_exit,SIGNAL(triggered()),qApp,SLOT(quit()));
    connect(ui->action_configuration,SIGNAL(triggered()),this,SLOT(action_configuration()));


    QCoreApplication::setOrganizationName("none");
    QCoreApplication::setOrganizationDomain("none");
    QCoreApplication::setApplicationName("none");
    QSettings settings;
    settings.setValue("test/test2","afa");
    QString cnt =   settings.value("test/test2").toString();
    //ui->debugger->setText(cnt);
}

MainWindow::~MainWindow()
{
    delete ui;
}

void MainWindow::action_configuration()
{
    form_acfg acfg;
    acfg.show();
}

Efekt jest taki, że jak wybiorę z górnego menu Konfiguracja->Konfiguruj, miga mi nowe okno (tj. pojawia się i od razu znika (w ciągu ułamka sekundy)). Nie ma błędów przy kompilacji. Co jest źle?

0

Tworzysz okno jako zmienną lokalną dla metody, potem pokazujesz niemodalne - show() wraca natychmiast po wyświetleniu okna, metoda się kończy i okno jest usuwane...

0

kurcze, ja tez mialem chyba wczoraj podobnego problema... to co zapodac zamiast "show"? showModal? ale nie ma...

0
#include <QtGui/QApplication>
#include "mainwindow.h"

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    MainWindow w;
    w.setWindowModality(Qt::ApplicationModal);
    w.show();
    return 0;
}

... i nie dziala

#include <QtGui/QApplication>
#include "mainwindow.h"

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    MainWindow w;
    w.setWindowModality(Qt::WindowModal);
    w.show();
    return 0;
}

... i tez nie dziala.

Wiec CO??????????????

0

w.exec();

0

Zmieniłem na:

void MainWindow::action_configuration()
{
    form_acfg acfg;
    acfg.setWindowModality(Qt::WindowModal);
    acfg.show();
}

I to nic nie dało. Jak zamiast show() dałem exec(), wywaliło:
error: 'class form_acfg' has no member named 'exec'

Co powinienem zmienić, aby zadziałało?

0

przerób klasę form_acfg tak by dziedziczyła po QDialog (to chyba logiczne, że tak powinieneś zrobić)!

0

Dzięki, działa.

Jeszcze jedno pytanie:
używam QSettings do zapisu i odczytu konfiguracji programu. Funkcje:

void functions::set_config(char *name,char *value)
{
    QCoreApplication::setOrganizationName("none");
    QCoreApplication::setOrganizationDomain("none");
    QCoreApplication::setApplicationName("none");
    QSettings settings;
    settings.setValue(name,value);
}


QString functions::get_config(char *name)
{
    QCoreApplication::setOrganizationName("none");
    QCoreApplication::setOrganizationDomain("none");
    QCoreApplication::setApplicationName("none");
    QSettings settings;
    QString value =   settings.value(name).toString();
    return value;
}


int functions::get_int_config(char *name)
{
    QCoreApplication::setOrganizationName("none");
    QCoreApplication::setOrganizationDomain("none");
    QCoreApplication::setApplicationName("none");
    QSettings settings;
    int value =   settings.value(name).toInt();
    return value;
}


char* functions::int2char(int n)
{
     int i = 0;
     char *tmp = (char*)malloc(12); // stdlib
     char *ret = (char*)malloc(12);
     if(n < 0) {
          *ret = '-';
          i++;
          n = -n;
     }
     do {
          *tmp = n % 10 + 48;
          n -= n % 10;
          if(n > 9) *tmp++;
     }
     while(n /= 10);
     while(ret[i++] = *tmp--);
     return ret;
}

Zapis:

void form_acfg::save()
{
    int time            =   m_ui->slider_time->value();
    int unlimited       =   m_ui->checkbox_unlimited_time->checkState();
    int lock_restart    =   m_ui->checkbox_lock_restart->checkState();


    funcs.set_config("config/time_to_answer",funcs.int2char(time));
    funcs.set_config("config/unlimited_time_to_answer",funcs.int2char(unlimited));
    funcs.set_config("config/lock_restart",funcs.int2char(lock_restart));

    this->close();
}

Odczyt:

    int unlimited_time_to_answer    =   funcs.get_int_config("config/unlimited_time_to_answer");
    int lock_restart                =   funcs.get_int_config("config/lock_restart");
    int time_to_answer              =   funcs.get_int_config("config/time_to_answer");


    m_ui->checkbox_unlimited_time->setChecked(unlimited_time_to_answer);
    m_ui->checkbox_lock_restart->setChecked(lock_restart);
    m_ui->slider_time->setValue(time_to_answer);
    m_ui->spinbox_time->setValue(time_to_answer);

Efekt: brak efektu (niezależnie od ustawień, checkboxy są odznaczone, a slider i spinbox są ustawione na 1 (minimalna wartość)). Zapis działa, bo sprawdzałem w rejestrze /HKEY_CURRENT_USER/Software/none/none/config/lock_restart=2|time_to_answer=30|unlimited_time_to_answer=0

Błąd na pewno jest w funkcji int functions::get_int_config(char *name). Co zrobić, aby zwróciło inta (.toInt() daje nulla, a .toString() powoduje błędy o braku funkcji QCheckBox::setChecked(QString&))?

0
  1. to

QCoreApplication::setOrganizationName("none");
QCoreApplication::setOrganizationDomain("none");
QCoreApplication::setApplicationName("none");

powinno się znaleźć w funkcji main zaraz za QApplication. W innych miejscach jest niepotrzebne.

  1. Czemu tot tak skomplikowałeś?
// unikanie "magic numbers"
const char KConfigGrupname[] = "config";
const char KSilederPosName[] = "unlimited_time_to_answer";
const char KLockRestartname[]  = "lock_restart";
const char KTimeToAnswer[]  =  "time_to_answer";

void form_acfg::save()
{
    QSettings settings;

    settings.beginGroup(KConfigGrupname);
    settings.setValue(KSilederPosName, m_ui->slider_time->value());
    settings.setValue(KLockRestartname, m_ui->checkbox_unlimited_time->checkState());
    settings.setValue(KTimeToAnswer, m_ui->checkbox_lock_restart->checkState());
    settings.endGroup();
    // this->close(); // to nie powinno się znaleźć w tej metodzie chyba, że ją nazwiesz: saveAndClose()
}

void form_acfg::load()
{
    QSettings settings;

    settings.beginGroup(KConfigGrupname);
    m_ui->slider_time->setValue(settings.value(KSilederPosName).toInt());
    m_ui->checkbox_unlimited_time->setChecked(settings.value(KLockRestartname).toBool());
    m_ui->checkbox_lock_restart->setChecked(settings.value(KTimeToAnswer).toBool());
    settings.endGroup();
    // this->close(); // to nie powinno się znaleźć w tej metodzie chyba, że ją nazwiesz: loadAndClose()
}

PS. zgadywałem nazwy metod, więc jak coś się nie zgadza to sam popraw.


I jeszcze jedno, zakładaj nowe wątki dla nowych tematów, a nie ciąg starych, na które dostałeś już odpowiedź (żeby był porządek).

1 użytkowników online, w tym zalogowanych: 0, gości: 1