Como posso ativar meu QDialogButtonBox.



  • Olá.
    Estou fazendo uma GUI e eu inseri nela um buttonbox (OK e Cancel).
    Eu clico com o botão direito em cima do ícone(OK e Cancel) e seleciono go to slot . Nessa função eu quero programar para que o botão OK feche a janela e salve todas as alterações feitas e que o botão Cancel feche a janela e não salve as alterações feitas.
    Como posso fazer isso?



  • Neutrox, vamos ver:

    1. Você pode utilizar o QtCreator e fazer a "conexão" no Design. Acho mais complicado. Crie um projeto bem simples. No maiwindow observe que criei uma classe QTeste. Fiz um 'promote' em componente QWidget da ui. Adicionei uma ligação slot no Design (clicar no segundo icone parte superior do qtCreator, segurar no botao e arrastar para o widget).
    1. A melhor forma (para mim) é fazer o uso do connect diretamente no código. Em um projeto simples, criar dois slots (confirmar e cancelar) no mainwindow. e ligar os botoes a eles:

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

    MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
    {
    ui->setupUi(this);

    connect(ui->pushButton,SIGNAL(clicked()),this,confirmar());
    connect(ui->pushButton_2,SIGNAL(clicked()),this,cancelar());
    }

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

    void MainWindow::confirmar()
    {
    }

    void MainWindow::cancelar()
    {
    }@

    De uma forma bem resumida, espero ter ajudado.



  • Obrigado pela sua explicação, só que o ponto que eu tenho dúvida é exatamente este:
    Qual será a função que eu colocarei em MainWindow::confirmar() e MainWindow::concelar(), para que a primeira feche e salve as alterações e a segunda feche e não salve as alterações.
    Todas as formas que eu tentei agora, a função está salvando as anterações em MainWindow::cancelar() mas eu não desejo salvar nesta função.



  • Em primeiro lugar você terá que criar dois novos 'slots' uma para confirmar() e outro para cancelar().

    @//adicionar no mainwindow.h
    public slots:
    void confirmar();
    void cancelar();
    @

    @//adicionar no mainwindow.cpp
    void MainWindow::confirmar()
    {
    //aqui confirma e sai
    }

    void MainWindow::cancelar()
    {
    //aqui cancela e sai
    }@

    Depois você deve ligar os botões a esses slots, cada um no seu. Aí que está a questão, no exemplo que postei tem como fazer isso através do QtCreator, arrastar e soltar. Mais volto a dizer que a segunda opção - a de ligação no próprio código - é a mais fácil.



  • fiz a ligação com o próprio código, dá um erro no meu connect:
    error: invalid use of void expression
    connect(ui->buttonBox,SIGNAL(clicked()),this,on_buttonBox_accepted());
    ^
    connect(ui->buttonBox,SIGNAL(clicked()),this,on_buttonBox_rejected());
    ^

    Coloquei exatamente no mesmo lugar que você.



  • Certo, vejamos sua linha:

    @connect(ui->buttonBox,SIGNAL),this,on_buttonBox_accepted());@

    O correto seria (veja a parte "(clicked()" que não existe em seu código) :

    @connect(ui->pushButton,SIGNAL(clicked()),this,on_buttonBox_accepted());@
    


  • Me desculpe, eu que escrevi a linha errada aqui. No meu código há o parte "(clicked())" e aparece este erro que eu falei anteriormente.



  • Exemplo de uso QButtonbox:

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

    #include <QMessageBox>

    MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
    {
    ui->setupUi(this);
    connect(ui->buttonBox,SIGNAL(accepted()),this,SLOT(confirmar()));
    connect(ui->buttonBox,SIGNAL(rejected()),this,SLOT(cancelar()));
    }

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

    void MainWindow::confirmar()
    {
    QMessageBox::information(this,"Confirmado","Confirmado");
    }

    void MainWindow::cancelar()
    {
    QMessageBox::information(this,"Cancelado","Cancelado");
    }@



  • Eu fiz isso e até aparece a mensagem do QMessageBox mas nada acontece com o programa. Não fecha e nem salva :(



  • Uma maneira que eu achei de resolver meu problema foi colocar na minha função @void MainWindow::on_buttonBox_accepted()@ a execução para escrever no meu arquivo de texto e em seguida utilizei o @qApp->quit()@ para fechar o programa.
    E em @void MainWindow::on_buttonBox_rejected()@ coloquei apenas o @qApp->quit()@ para fechar e não executar nenhuma escrita no meu arquivo.


Log in to reply
 

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