Vydělávej až 160.000 Kč měsíčně! Akreditované rekvalifikační kurzy s garancí práce od 0 Kč. Více informací.
Hledáme nové posily do ITnetwork týmu. Podívej se na volné pozice a přidej se do nejagilnější firmy na trhu - Více informací.

Diskuze: dialogové okénko

Aktivity
Avatar
petr.dar
Člen
Avatar
petr.dar:14.10.2015 20:00

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
Tvůrce
Avatar
Sony Nguyen:14.10.2015 21:02

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:15.10.2015 15:32

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
Tvůrce
Avatar
Odpovídá na petr.dar
Sony Nguyen:15.10.2015 18:54

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:16.10.2015 20:12

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
Tvůrce
Avatar
Sony Nguyen:16.10.2015 22:30

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:16.10.2015 23:02

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
Tvůrce
Avatar
Odpovídá na petr.dar
Sony Nguyen:17.10.2015 1:26

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:17.10.2015 4:20

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
Tvůrce
Avatar
Sony Nguyen:17.10.2015 10:14

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:20.10.2015 16:35

Mám sem hodit zdroják?

 
Nahoru Odpovědět
20.10.2015 16:35
Avatar
Sony Nguyen
Tvůrce
Avatar
Odpovídá na petr.dar
Sony Nguyen:20.10.2015 17:29

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:20.10.2015 18:02

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
Tvůrce
Avatar
Odpovídá na petr.dar
Sony Nguyen:20.10.2015 18:50
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:20.10.2015 20:23

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
Tvůrce
Avatar
Sony Nguyen:20.10.2015 22:03

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:20.10.2015 23:57

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.