Diskuze: dialogové okénko

C++ C a C++ dialogové okénko

Avatar
petr.dar
Člen
Avatar
petr.dar:

Ahoj, zkoušim v QT vytvořit takovéto okénko, ale nemůžu přijít na to, jak odstranit ty min a max. tlačítka, aby nešla změnit velikost, a aby to nešlo otevřít vícekrát.
Zatim používám jen #include <QWidget>, mám na to použít jinou knihovnu, nebo to lze upravit i v této knihovně?

 
Odpovědět 14.10.2015 20:00
Avatar
Sony Nguyen
Redaktor
Avatar
Sony Nguyen:

QDialog neobsahuje min ani max tlačítka, ale jde resizovat
EDIT: Ale QInputDialog plní funkčnost tvého widgetu, má dvě tlačítka a jeden QLineEdit

Editováno 14.10.2015 21:05
 
Nahoru Odpovědět 14.10.2015 21:02
Avatar
petr.dar
Člen
Avatar
Odpovídá na Sony Nguyen
petr.dar:

Mno jo, ale tam nemůžu přidávat Spinbox, další buttony a další věci

 
Nahoru Odpovědět 15.10.2015 15:32
Avatar
Sony Nguyen
Redaktor
Avatar
Odpovídá na petr.dar
Sony Nguyen:

Do QInputDialog nee, ale do QDialog můžeš

Editováno 15.10.2015 18:54
 
Nahoru Odpovědět 15.10.2015 18:54
Avatar
petr.dar
Člen
Avatar
Odpovídá na Sony Nguyen
petr.dar:

ok, a jak zabránim tomu resizování, prostě normální dialogové okýnko jako je třeba v poznámkovým bloku ve vyhledávání? A jak bych zabránil tomu otevírání když už je otevřen

 
Nahoru Odpovědět 16.10.2015 20:12
Avatar
Sony Nguyen
Redaktor
Avatar
Sony Nguyen:

QWidget::setFi­xedSize(QWidget::si­zeHint()); //místo QWidget::size­Hint(), tam můžeš taky natvrdo dát nějakou velikost, ale to moc nedoporučuji. A bohužel nevím, co myslíš, tím že se znovu neotevře, když už je otevřen. Měl bys mít jednu instanci a když nad ní znova zavoláš show(), když je zobrazena, tak by se nemělo nic stát :)

Editováno 16.10.2015 22:32
 
Nahoru Odpovědět 16.10.2015 22:30
Avatar
petr.dar
Člen
Avatar
Odpovídá na Sony Nguyen
petr.dar:

Funguje super:-)
A ten otevřený widget se nemá otevírat víckrát po stisknutí Add. Mám tam zadat Item, který se pak zobrazí v hlavním okně. Je to jako kdyby ta aplikace byla spuštěna víckrát. Jak tomu zabránim?

 
Nahoru Odpovědět 16.10.2015 23:02
Avatar
Sony Nguyen
Redaktor
Avatar
Odpovídá na petr.dar
Sony Nguyen:

Asi budeš nějak kontrolovat, jestli je zobrazený nebo není. Bez zdrojáku ti lepší řešení bohužel nemůžu poskytnout.

 
Nahoru Odpovědět 17.10.2015 1:26
Avatar
petr.dar
Člen
Avatar
Odpovídá na Sony Nguyen
petr.dar:

No jen sem myslel že je na to nějaká funkce nebo enum. Pohlídat si to nemůžu protože když to otevřu je to jak 2x spuštěný, když zavřu hlavní okno, klidně mi zustane ten samotný widget, díky za size :-)

 
Nahoru Odpovědět 17.10.2015 4:20
Avatar
Sony Nguyen
Redaktor
Avatar
Sony Nguyen:

Možná je, ale vůbec nevím jak tam s tím šachruješ...

 
Nahoru Odpovědět 17.10.2015 10:14
Avatar
petr.dar
Člen
Avatar
Odpovídá na Sony Nguyen
petr.dar:

Mám sem hodit zdroják?

 
Nahoru Odpovědět 20.10.2015 16:35
Avatar
Sony Nguyen
Redaktor
Avatar
Odpovídá na petr.dar
Sony Nguyen:

Pokud to nevadí :-)... Stačí nějaké útržky, protože jsem nepobral jak tam tvoříš ty okna

 
Nahoru Odpovědět 20.10.2015 17:29
Avatar
petr.dar
Člen
Avatar
Odpovídá na Sony Nguyen
petr.dar:

No tak hlavní okno programu:

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

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    MainWindow w;
    w.show();

    return a.exec();
}

hlavička MainWindow.h:

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include <QListWidget>
#include <QLineEdit>
#include <QDialog>

class MainWindow : public QWidget
{
    Q_OBJECT

public:
    MainWindow(QWidget *parent = 0);
    ~MainWindow();
private:
  QListWidget * ListWidget;
  QString Itm;
  QLineEdit * txt;
  QDialog * W;
public slots:
    void add();
    void addtxt();
    void ButtonOk();

};

#endif // MAINWINDOW_H

a metody:

#include "mainwindow.h"
#include <QListWidget>
#include <QPushButton>
#include <QGridLayout>
#include <QLabel>
#include <QLineEdit>
#include <QInputDialog>
#include <QDialog>

MainWindow::MainWindow(QWidget *parent)
    : QWidget(parent)
{
    ListWidget = new QListWidget;
    ListWidget->addItem("prvni item");
    QPushButton * pridat = new QPushButton("Add");
    QPushButton * Ok = new QPushButton("Ok");
    QPushButton * Cancel = new QPushButton("Cancel");
    QGridLayout * GLayout = new QGridLayout;
    txt = new QLineEdit();
    GLayout->addWidget(ListWidget,0,0,3,3);
    GLayout->addWidget(Ok,4,0);
    GLayout->addWidget(Cancel,4,1);
    GLayout->addWidget(pridat,4,2);
    setLayout(GLayout);
    connect(pridat,SIGNAL(clicked()),this,SLOT(add()));
    connect(Ok,SIGNAL(clicked()),SLOT(close()));
    connect(Cancel,SIGNAL(clicked()),SLOT(close()));
 }


MainWindow::~MainWindow()
{
   delete ListWidget;
   delete txt;
   delete W;
}

void MainWindow::add()
{
 W = new QDialog(this);
 QGridLayout * GLayout = new QGridLayout;
 QLabel * Name = new QLabel("Zadej něco:");
 QPushButton * Ok = new QPushButton("Ok");
 QPushButton * Cancel = new QPushButton("Cancel");
 GLayout->addWidget(Name,0,0,Qt::AlignHCenter);
 GLayout->addWidget(txt,0,1,Qt::AlignHCenter);
 GLayout->addWidget(Ok,1,0,Qt::AlignLeft);
 GLayout->addWidget(Cancel,1,1,Qt::AlignRight);
 W->setLayout(GLayout);
 connect(Ok,SIGNAL(clicked()),this,SLOT(ButtonOk()));
 connect(Cancel,SIGNAL(clicked()),W,SLOT(close()));
 connect(txt,SIGNAL(editingFinished()),this,SLOT(addtxt()));
 //W->setAttribute(Qt::WA_WindowPropagation);
 W->setFixedSize(QWidget::sizeHint());

 W->show();

}

void MainWindow::ButtonOk()
{
 ListWidget->addItem(Itm);
 W->close();
}

void MainWindow::addtxt()
{
 Itm = txt->displayText();
}

Snad se to zobrazí dobře

 
Nahoru Odpovědět 20.10.2015 18:02
Avatar
Sony Nguyen
Redaktor
Avatar
Odpovídá na petr.dar
Sony Nguyen:
W = new QDialog(this);

Tento řádek pořád vytváří novou instanci, to nechceme, takže vytvoř jenom jednu instanci v konstruktoru, stejně tak všechny tlačítka a texty stačí vytvořit jenom jednou, nabindování taky stačí jednou :D... Takže obsah metody "add" stačí provést jednou např. při konstrukci instance třídy MainWindow, a v "add" by ti mělo zůstat jenom

W->show()
Editováno 20.10.2015 18:51
 
Nahoru Odpovědět 20.10.2015 18:50
Avatar
petr.dar
Člen
Avatar
petr.dar:

Dobrý nápad, přesunout to všechno do konstruktoru, ale tim se ten problem vyřeší jen částečně, Prostě potřebuju abych si nemohl překliknout do hlavního okna když tam zadávám Item...

 
Nahoru Odpovědět 20.10.2015 20:23
Avatar
Sony Nguyen
Redaktor
Avatar
Sony Nguyen:

QDialog::exec() funguje, ale bojím se, že to blokuje GUI vlákno, takže QDialog::setMo­dal(true) a pak zavolat QDialog::show() je podle mě nejlepší řesení :).

Snad pomohlo :)

Editováno 20.10.2015 22:03
 
Nahoru Odpovědět 20.10.2015 22:03
Avatar
petr.dar
Člen
Avatar
Odpovídá na Sony Nguyen
petr.dar:

No nechápu to GUI vlákno ale fungují obě možnosti. Super thx :-)

 
Nahoru Odpovědět 20.10.2015 23:57
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 17 zpráv z 17.