Russian Qt Forum

Qt => Пользовательский интерфейс (GUI) => Тема начата: Magvaj от Март 21, 2009, 13:41



Название: QTableWidget как Popup менюшка
Отправлено: Magvaj от Март 21, 2009, 13:41
Возникла необходимость создать всплывающее окно с табличкой. Решил делать через QTableWidget

Да вот в чём загвоздка- устанавливаю флаг Qt::Popup, отображаю виджет и он лочит весь экран до тех пор, пока по виджету не кликнуть.

Подскажите как сделать правильный Popup, а то уже три дня с флагами и евентами кручу, да так и не добился ничего :(


Название: Re: QTableWidget как Popup менюшка
Отправлено: baka от Март 21, 2009, 14:40
покажи на всякий случай исходник который у тебя получился.

я когда последний раз делал подобное то флаги у меня были такие
:QWidget(0, Qt::FramelessWindowHint | Qt::WindowStaysOnTopHint | Qt::SplashScreen)

и вызывать не exec() а show()
т.е. чтоб окно было не модальное.


Название: Re: QTableWidget как Popup менюшка
Отправлено: SABROG от Март 21, 2009, 14:51
Вот.

Код
C++ (Qt)
void MainWindow::on_pushButton_clicked()
{
   QWidget *base = new QWidget(this, Qt::Popup);
   QPushButton *btn = qobject_cast<QPushButton *>(sender());
   QPoint gps = mapToGlobal(btn->pos());
   gps += btn->rect().bottomLeft();
   QRect trect(gps, QSize(500, 500));
 
   base->setGeometry(trect);
   QGridLayout *grid = new QGridLayout(base);
   QTableWidget *tb = new QTableWidget(base);
   grid->addWidget(tb);
   tb->setColumnCount(2);
   tb->setRowCount(10);
   for (int i=0; i < 10; i++)
   {
           for (int j=0; j < 2; j++)
           {
               QTableWidgetItem *item = new QTableWidgetItem(QString("%1:%2").arg(i).arg(j));
               tb->setItem(i, j, item);
           }
   }
   base->show();
}
 

Чтобы окно закрывалось при выборе итема надо сигналы вешать на QItemSelectionModel



Название: Re: QTableWidget как Popup менюшка
Отправлено: Magvaj от Март 22, 2009, 15:41
Код:
if(!smilesisshowedones)
{
//создание виджета для смайлов
twSmiles=new QTableWidget();
                twSmiles->setWindowFlags(Qt::Popup);
twSmiles->setObjectName(QString::fromUtf8("Смайлы"));
twSmiles->setColumnCount(4);
if((w1sml.count()*.25)==(int(w1sml.count()/.25)))
{
//ровное число
twSmiles->setRowCount(w1sml.count()/4);
}
else
{
//неровное число
twSmiles->setRowCount(int(w1sml.count()/4)+1);
}
(twSmiles->horizontalHeader())->hide();
(twSmiles->horizontalHeader())->setResizeMode(QHeaderView::Stretch);
(twSmiles->verticalHeader())->hide();
twSmiles->move(this->tbSmiles->mapToGlobal(QPoint(1, 1)));
twSmiles->setFixedSize(200, 200);

//загрузка смайлов в виджет
for(int i=0; i<w1sml.count(); i++)
{
QLabel *l=new QLabel((QWidget*)(this->twSmiles));
l->setObjectName(w1sml[i].text);
QMovie *mov=new QMovie(W1_SMILEDIR2+w1sml[i].file);
l->setMovie(mov);
mov->start();
l->setAlignment(Qt::AlignCenter);
twSmiles->setCellWidget(int(i/4), i-int(i/4)*4, l);
}
smilesisshowedones=true;
connect(this->twSmiles, SIGNAL(cellClicked(int, int)), this, SLOT(onSmileSelected(int, int)));
}
twSmiles->show();

Чтото типа того... Вызывается как раз show() и пока по виджету не щёлкнешь и он не исчезнет ничего не пашет вокруг :(


Название: Re: QTableWidget как Popup менюшка
Отправлено: Magvaj от Март 22, 2009, 20:37
SABROG, благодарю. Разобрался. Твой код сильно помог.

Однако так и не пойму почему Popup по-нормальному создаётся только от QWidget, а не от всех наследованных компонентов.