Название: 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, а не от всех наследованных компонентов.
|