Russian Qt Forum

Qt => Общие вопросы => Тема начата: PavelDart от Декабрь 27, 2009, 20:31



Название: Доступ к элементам окна, описанного в cpp-файле.
Отправлено: PavelDart от Декабрь 27, 2009, 20:31
Сейчас, можно сказать, сам себя в угол загнал.
Если до этого все формы проекта описывались в ui_h и в h-файлах, а потом уже управлялись в cpp, то сейчас одну форму для удобства я решил создавать в процедуре cpp.

Код
C++ (Qt)
void mw::grph_in_slot()
{
 
 
 
int n=grph_quant->text().toInt();
int wgt_width=350;
int wgt_height;
const int proct=10;
 
 
QWidget* wgt = new QWidget();
 
// QWidget wgt;
QPushButton* pcmdB = new QPushButton("Enter data");
QHBoxLayout* phbxLayout = new QHBoxLayout()/*(QBoxLayout::LeftToRight)*/;
QVBoxLayout* pvbxLayout = new QVBoxLayout();
 
 
QTableWidget* tbl = new QTableWidget(n,n);
QTableWidgetItem* ptwi=0;
QStringList lst;
 
 
 
/*lst << "First" << "Second" << "Third";
tbl->setHorizontalHeaderLabels(lst);
tbl->setVerticalHeaderLabels(lst);*/

// tbl->resizeColumnsToContents();
// tbl->resizeRowsToContents();
 
 
for (int i=0; i<n; i++)
{
for (int j=0; j<n; j++)
{
ptwi = new QTableWidgetItem(QString("0")/*.arg(i).arg(j)*/);
tbl->setItem(i,j,ptwi);
tbl->setColumnWidth(i,((wgt_width)/proct)-1);
}
 
}
wgt_width=tbl->columnWidth(0)*n; // -здесь мы вычислили ширину тэйблвиджет
wgt_height=tbl->rowHeight(0)*n;
tbl->resize(wgt_width,wgt_height);
 
phbxLayout->addWidget(tbl);
pvbxLayout->addLayout(phbxLayout);
pvbxLayout->addWidget(pcmdB,0);
 
wgt->setLayout(pvbxLayout);
 
wgt->resize(wgt_width+40,wgt_height+80);
wgt->show();
// wgt->setVisible(true);
// wgt->raise();
 
}

Но вот проблема, мне понадобилось по нажатию клавиши, закрыть эту форму и все данные с tableWidget переместить в глобальную переменную. Но доступа к объектам этой формы другие процедуры соответвенно не имеют.

Придётся ли описывать форму с tableWidget как другие формы или есть какой-то иной выход?


Название: Re: Доступ к элементам окна, описанного в cpp-файле.
Отправлено: BRE от Декабрь 27, 2009, 20:36
Придётся ли описывать форму с tableWidget как другие формы или есть какой-то иной выход?
Желательно сделать отдельный диалог.


Название: Re: Доступ к элементам окна, описанного в cpp-файле.
Отправлено: PavelDart от Декабрь 27, 2009, 20:43
Желательно сделать отдельный диалог.

Да, нелучшей идеей было впихивать конструкторы в процедуру.


Название: Re: Доступ к элементам окна, описанного в cpp-файле.
Отправлено: break от Декабрь 28, 2009, 02:10
В вашем случае так же как и в случае если форма была загружена из ui  прямо в программе через uiloader - необходимо воспользоваться функциями поиска дочерних элементов по именам. Для этого при создание элементов задайте им objectName и потом можете искать через

Код
C++ (Qt)
T findChild ( const QString & name = QString() ) const
QList<T> findChildren ( const QString & name = QString() ) const
QList<T> findChildren ( const QRegExp & regExp ) const

получать указатель на нужный подвиджет нужного типа и работать с ним, например так

Код
C++ (Qt)
QLabel * pLabel   = m_pMyForm->findChild<QLabel *>("my_test_label");
 
pLabel->setText("it's work");
 


Название: Re: Доступ к элементам окна, описанного в cpp-файле.
Отправлено: ilot от Декабрь 28, 2009, 12:17
Цитировать
Придётся ли описывать форму с tableWidget как другие формы или есть какой-то иной выход?
Нужно создать отдельный класс, наследованный от QWidget, и инкапсулировать в нем всю необходимую форме функциональность. Все действия по сборке интерфейса, которые сейчас выполняются в void mw::grph_in_slot(), должные выполняться в конструкторе данного виджета. Для обработки нажатия клавиши создать приватный слот:
Код:
private slots:
void buttonClicked(){
...
hide();
};

В void mw::grph_in_slot() останется только создать объект данного класса.


Название: Доступ к элементам окна, описанного в cpp-файле.
Отправлено: PavelDart от Декабрь 28, 2009, 16:30
Мне виделся только один выход - по средству создания класса в заголовочном файле, позже просто обращаться к нему из файла с реализацией. А вот про вариант предложенный break я не знал. Попробую оба.
Благодарю за ответы, наступающим новым годом :) !