Diskuze: dialogové okénko
V předchozím kvízu, Online test znalostí C++, jsme si ověřili nabyté zkušenosti z kurzu.
Člen
Zobrazeno 17 zpráv z 17.
//= Settings::TRACKING_CODE_B ?> //= Settings::TRACKING_CODE ?>
V předchozím kvízu, Online test znalostí C++, jsme si ověřili nabyté zkušenosti z kurzu.
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
Mno jo, ale tam nemůžu přidávat Spinbox, další buttony a další věci
Do QInputDialog nee, ale do QDialog můžeš
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
QWidget::setFixedSize(QWidget::sizeHint()); //místo QWidget::sizeHint(), 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
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?
Asi budeš nějak kontrolovat, jestli je zobrazený nebo není. Bez zdrojáku ti lepší řešení bohužel nemůžu poskytnout.
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
Možná je, ale vůbec nevím jak tam s tím šachruješ...
Pokud to nevadí ... Stačí nějaké útržky, protože jsem nepobral jak tam tvoříš ty okna
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
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 ... 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()
QDialog::exec() funguje, ale bojím se, že to blokuje GUI vlákno, takže QDialog::setModal(true) a pak zavolat QDialog::show() je podle mě nejlepší řesení .
Snad pomohlo
No nechápu to GUI vlákno ale fungují obě možnosti. Super thx
Zobrazeno 17 zpráv z 17.