Russian Qt Forum
Ноябрь 01, 2024, 05:24 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: Доступ к элементам окна, описанного в cpp-файле.  (Прочитано 4359 раз)
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 как другие формы или есть какой-то иной выход?
Записан
BRE
Гость
« Ответ #1 : Декабрь 27, 2009, 20:36 »

Придётся ли описывать форму с tableWidget как другие формы или есть какой-то иной выход?
Желательно сделать отдельный диалог.
Записан
PavelDart
Гость
« Ответ #2 : Декабрь 27, 2009, 20:43 »

Желательно сделать отдельный диалог.

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

Сообщений: 846


Просмотр профиля
« Ответ #3 : Декабрь 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");
 
Записан
ilot
Гость
« Ответ #4 : Декабрь 28, 2009, 12:17 »

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

В void mw::grph_in_slot() останется только создать объект данного класса.
Записан
PavelDart
Гость
« Ответ #5 : Декабрь 28, 2009, 16:30 »

Мне виделся только один выход - по средству создания класса в заголовочном файле, позже просто обращаться к нему из файла с реализацией. А вот про вариант предложенный break я не знал. Попробую оба.
Благодарю за ответы, наступающим новым годом Улыбающийся !
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.261 секунд. Запросов: 23.