Russian Qt Forum

Qt => Общие вопросы => Тема начата: kadr от Октябрь 26, 2009, 20:50



Название: Работа с виджетами!
Отправлено: kadr от Октябрь 26, 2009, 20:50
Привет! Подскажите, вот возникла необходимость получить доступ к компанентам с одного выджета к другому, а если точнее- есть два поля, при двойном клике на строчке одного поля, вся строчка переноситься в другое поле, но перед этим открывается виджет на котором надо указать количество, которое присутсвует  в одном из столбцов переносимой строки, так вот надо что бы после того как введено нужное количество и нажата кнопка, во втором поле в колонке с количеством проставилось то количество которое было указано в виджете!
Как можно это все осуществить?  ???


Название: Re: Работа с виджетами!
Отправлено: Пантер от Октябрь 26, 2009, 20:58
Что-то как-то расплывчато написано. Давай конкретнее с примерами.


Название: Re: Работа с виджетами!
Отправлено: pastor от Октябрь 26, 2009, 21:03
а если точнее- есть два поля, при двойном клике на строчке одного поля, вся строчка переноситься в другое поле

А если еще точнее? Чем представлены эти "поля"?


Название: Re: Работа с виджетами!
Отправлено: kadr от Октябрь 26, 2009, 21:29
Одним словом два поля QTableWidget с одинаковыми колонками (Название, количество, цена, производитель). Так вот в одном поле отображаются все товары, второе это типа корзины, в которое набирается товар. Так вот по двойному клику, товар - строчка челиком, а точнее каждая ячейка, переходит в дрогое поле:
QString kol;
     QWidget *tov = new tov_kol;
     tov->show();
     tov->setGeometry(500,400,400,103);
     tov->setFixedSize(99,48);
     //----------------------------------------------------------------------------------------------------
     ui->korzina->insertRow(kors);
     ui->korzina->setItem(kors,0, new QTableWidgetItem(ui->pole->item(ui->pole->currentRow(),0)->text()));
     ui->korzina->setItem(kors,1, new QTableWidgetItem(ui->pole->item(ui->pole->currentRow(),1)->text()));
    
     ui->korzina->setItem(kors,3, new QTableWidgetItem(ui->pole->item(ui->pole->currentRow(),3)->text()));
     ui->korzina->setItem(kors,4, new QTableWidgetItem(ui->pole->item(ui->pole->currentRow(),4)->text()));
    
     kors++;
После двойного клика открывается виджет под названием tov_kol, на котором есть 3 компонента: собственно label, splinBox и кнопка, после нажатия на которую должно происходить следующее:
1. Число из splinBox-а должно переходить во второе поле ui->korzina в колонку количество
2. виджет tov_kol закрывается!
Да и надо сделать как то чтобы пока он не закрылся, он не давал ничего больше делать, то есть постоянно находился в фокусе!


Название: Re: Работа с виджетами!
Отправлено: lit-uriy от Октябрь 26, 2009, 23:13
Цитировать
Да и надо сделать как то чтобы пока он не закрылся, он не давал ничего больше делать, то есть постоянно находился в фокусе!
Для этого используй void setWindowModality ( Qt::WindowModality windowModality )


Название: Re: Работа с виджетами!
Отправлено: kadr от Октябрь 27, 2009, 09:52
Цитировать
Да и надо сделать как то чтобы пока он не закрылся, он не давал ничего больше делать, то есть постоянно находился в фокусе!
Для этого используй void setWindowModality ( Qt::WindowModality windowModality )
Хорошо, с этим понятно, а главное то так и осталось без ответа, как мне получить доступ то к компанентам другого виджета?


Название: Re: Работа с виджетами!
Отправлено: Пантер от Октябрь 27, 2009, 12:33
QWidget *tov = new tov_kol;
tov это QWidget или tov_kol?
Что-то у тебя все настолько нехорошо...
Как нужно:
Наследуешься от QWidget, раскидываешь нужные контролы и определяешь функции:
Код
C++ (Qt)
void setValue(int value) (spinBox->setValue(value);)
int value() {return spinBox->value();}
А потом к ним обращаешься.


Название: Re: Работа с виджетами!
Отправлено: kadr от Октябрь 27, 2009, 16:36
tov это локальный идентификатор виджета, tov_kol, который я создал и добавил в проект.


Название: Re: Работа с виджетами!
Отправлено: Пантер от Октябрь 27, 2009, 17:44
Как ты его создал? Как добавляешь в проект?
"Ничего не понимаю" (Братья пилоты)
Код
C++ (Qt)
QWidget *tov = new QWidget;
tov_kol *tov = new tov_kol;
 
Вот 2 варианта, которые могут быть, а у тебя вообще не пойми что.


Название: Re: Работа с виджетами!
Отправлено: kadr от Октябрь 27, 2009, 19:51
Да я использую вот этот вариант QWidget *tov = new tov_kol; плюс я его подключаю через #include "tov_kol.h" вот.
Этот виджет открывается при двойном нажатии на любой строке в поле QTableWidget.

void MainWindow::on_pole_doubleClicked(QModelIndex index)
{
     QString kol;
     QWidget *tov = new tov_kol;
     tov->show();
     tov->setGeometry(500,400,400,103);
     tov->setFixedSize(99,48);
     //----------------------------------------------------------------------------------------------------
     ui->korzina->insertRow(kors);
     // qDebug() << ui->pole->item(ui->pole->currentRow(),0)->text();
     ui->korzina->setItem(kors,0, new QTableWidgetItem(ui->pole->item(ui->pole->currentRow(),0)->text()));
     ui->korzina->setItem(kors,1, new QTableWidgetItem(ui->pole->item(ui->pole->currentRow(),1)->text()));
     //ui->pole->setItem(row,2, new QTableWidgetItem(q.value(2).toString()));
     ui->korzina->setItem(kors,3, new QTableWidgetItem(ui->pole->item(ui->pole->currentRow(),3)->text()));
     ui->korzina->setItem(kors,4, new QTableWidgetItem(ui->pole->item(ui->pole->currentRow(),4)->text()));
     //ui->pole->setItem(row,5, new QTableWidgetItem(q.value(4).toString()));
     kors++;
     ui->kol->setText(kol.setNum(ui->korzina->rowCount()));
}
Надо что бы после нажатия на кнопку в виджете tov_kol, цифра из splinBox виджета tov_kol, заносилась в
ui->korzina->setItem(kors,1, new QTableWidgetItem("вот сюда"));


Название: Re: Работа с виджетами!
Отправлено: Пантер от Октябрь 28, 2009, 07:16
Я уже объяснил, вводишь в tov_kol поля value и setValue и через них работаешь. Что не понятно?


Название: Re: Работа с виджетами!
Отправлено: kadr от Октябрь 28, 2009, 10:30
Я уже объяснил, вводишь в tov_kol поля value и setValue и через них работаешь. Что не понятно?
Блин я не понимаю как ей пользоваться в какую часть кода ее вставлять:

void setValue(int value) (kol_box->setValue(value))
    {
        int value();
        return kol_box->value();
    }
И как к ней потом обращаться с другого виджета?


Название: Re: Работа с виджетами!
Отправлено: Пантер от Октябрь 28, 2009, 12:39
Ппц.
Код
C++ (Qt)
class MyWidget : public QWidget
{
private:
   QSpinBox *spinBox;
public:
   MyWidget(QWidget *parent) {
       spinBox = new QSpinBox(this);
       QVBoxLayout *layout = new QVBoxLayout();
       layout->addWidget(spinBox);
       setLayout(layout);
   }
 
   void setValue(int value) {spinBox->setValue(value);}
   void value() {return spinBox->value();}
};
 
Код
C++ (Qt)
void someFunction()
{
   myWidget = new MyWidget(this);
   myWidget->setValue(someValue);
   myWidget->show();
//=====================
   someValue = myWidget->value();
}
 
Если и сейчас не понятно, то я уже не знаю как дальше разжевывать.