Просмотр сообщений
|
Страниц: 1 ... 65 66 [67] 68 69
|
991
|
Qt / Пользовательский интерфейс (GUI) / Удаление пунктов меню из menuBar главного окна
|
: Июнь 22, 2011, 17:04
|
Привет. Добавляю в menuBar главного окна свои пункты меню так: if(fmainMenu) //-- ссылка на menuBar() главного окна { fmainMenu->setUpdatesEnabled(false); if(!fconnMenu) { fconnMenu = new QMenu(trUtf8("Связь")); fconnMenu->addAction(trUtf8("Подключиться"),this,SIGNAL(connectToServer())); fconnMenu->addAction(trUtf8("Отключиться"),this,SIGNAL(disconnectFromServer())); fmainMenu->addMenu(fconnMenu);
}
if(!farchMenu) { farchMenu = new QMenu(trUtf8("Работа с архивом")); farchMenu->addAction(trUtf8("Реальное время"),this,SIGNAL(setRealtime())); for(ECList::iterator it=fecList->begin();it!=fecList->end();it++) { CEC * ec = *it; QAction * action = farchMenu->addAction(trUtf8("Просмотр архива ЭЦ%1").arg(QString::number(ec->ec_number))); action->setData(QVariant(ec->ec_number)); } } fmainMenu->setUpdatesEnabled(true); }
у menuBar я не нашёл метода для удаления пунктов меню, только удаления QAction. Сейчас удаляю так: if(fmainMenu) { if(fconnMenu) { delete fconnMenu; fconnMenu = NULL; } if(farchMenu) { delete farchMenu; farchMenu = NULL; } }
но в главном меню эти пункты остаются. Как их убрать?
|
|
|
992
|
Qt / Пользовательский интерфейс (GUI) / Растяжка виджетов при изменении размера окна
|
: Июнь 16, 2011, 11:16
|
Подскажите пожалуйста, какие свойства задавать виджетам, что бы они растягивались по форме при изменении размера окна? Как в делфи свойство Align или Anchor. Т.е. например надо, что бы метка имела фиксированный размер, а текстовое поле, которое рядом справа растягивалось до конца формы, и изменяло свой размер при изменении размера родительской формы. можно ли обойтись без layout, так как не всегда получается нужный вид формы, если контролы помещать в них.
|
|
|
995
|
Qt / Пользовательский интерфейс (GUI) / Перехват фокуса в дочерних виджетах
|
: Июнь 07, 2011, 13:05
|
Пишу свой инспектор объектов для миниSCADA. Создал наследника от QWidget EditableWidget, задача которого разместить в себе дочерний виджет (обычно это будет либо lineEdit либо textEdit). При получении фокуса, будет рядом отображаться кнопка с текстом "...", при нажатии на которую нужно послать сигнал. При потере фокуса кнопка исчезает. Суть понятна, это стандартная фишка всех инспекторов объектов. Сами эти виджеты я распологаю в таблице методом setCellWidget. Про делегаты я слышал но пока не вникал. при чем, виджеты будут встраиваться разные. QEditableWidget::QEditableWidget(QWidget *parent) : QWidget(parent) { ftoolButton = NULL; feditableWidget = NULL; setFocusPolicy(Qt::ClickFocus); }
void QEditableWidget::setEditableWidget(QWidget * EditableWidget) { if(feditableWidget!=EditableWidget) { setUpdatesEnabled(false); if(feditableWidget) { setFocusProxy(NULL); delete feditableWidget; delete ftoolButton; } feditableWidget = EditableWidget; if(feditableWidget) { feditableWidget->setParent(this); feditableWidget->setFocusPolicy(Qt::NoFocus); feditableWidget->setGeometry(rect()); } setUpdatesEnabled(true); } }
void QEditableWidget::focusInEvent(QFocusEvent * event) { if(feditableWidget) { feditableWidget->setGeometry(rect().adjusted(-1,-1,geometry().width()-geometry().height(),0)); } ftoolButton = new QToolButton; ftoolButton->setText("..."); ftoolButton->setParent(this); ftoolButton->setGeometry(rect().adjusted(geometry().width()-geometry().height(),-1,-1,0)); ftoolButton->show(); connect(ftoolButton,SIGNAL(clicked()),this,SIGNAL(editButtonClicked())); QWidget::focusInEvent(event); }
void QEditableWidget::focusOutEvent(QFocusEvent * event) { QWidget::focusOutEvent(event); delete ftoolButton; if(feditableWidget) feditableWidget->setGeometry(rect()); }
Проблема, как сделать так, что бы отловить событие получение фокуса моим виджетом, затем отобразить кнопку, а потом установить фокус ввода на дочерний виджет, при этом отловить потерю фокуса уже в дочернем виджете что бы кнопка исчезла.
|
|
|
996
|
Qt / Qt-инструментарий / ошибка сборки проекта при использорвании jom
|
: Май 25, 2011, 16:35
|
решил заменить make на jom (win7, Qt 2010.04). сразу при сборке проекта вылезло очень много ошибок, суть которых - не найдена библиотека <Q.....> (т.е. не находятся все стандартные либы). я так понял jom не хавает стандартные пути, которые относятся к Qt?
|
|
|
997
|
Qt / Работа с сетью / Re: Корректное завершение нескольких клиентских потоков
|
: Май 20, 2011, 12:45
|
вообще по плану будет 5 подключений к разным машинам, все одновременно будут получать данные с серверов. данные идут потоком, непрерывно каждые 250 мсек кадры по 4-8Кб. помимо того, в основном потоке еще идёт прорисовка в GraphicsScene около 1000 объектов + логика расчета состояний. поэтому резонно хотя бы чтение по сокетам перенести в одельные потоки. В целом пока этот механизм работает нормально.
|
|
|
998
|
Qt / Работа с сетью / Корректное завершение нескольких клиентских потоков
|
: Май 19, 2011, 17:39
|
Есть несколько потоков (Qt шных), в которых идет прием по клиентским сокетам. по нажатию кнопки, нужно корректно завершить все потоки, предварительно закрыв соединение в этих потоках. Корректен ли такой подход, который привожу ниже: код потока клиента void QMMNClientThread::run() { mmnClient->connectToServer(); exec(); }
void QMMNClient::disconnectFromServer() { fmustReconnect = false; if(fsocket->state() == QAbstractSocket::ConnectedState) { fsocket->close(); fsocket->waitForDisconnected(); } }
при дисконекте клиента, выдерживаю паузу в 2 секунды и делаю реконтект и так вечно пока не надо принудительно завершить работу потока void CEC::startClient() { for(int i=0;i<1;i++) //в будущем тут будет несколько потоков { if(!mmnClientThread[i]) mmnClientThread[i] = new QMMNClientThread(this); //создаем поток mmnClientThread[i]->mmnClient->remoteHost = Host[i]; //задаем к кому подключаться mmnClientThread[i]->mmnClient->remotePort = Port[i]; connect(mmnClientThread[i]->mmnClient,SIGNAL(frameReceived(int)),this,SLOT(data_receive(int))); //обработка принятых данных connect(mmnClientThread[i]->mmnClient,SIGNAL(connected(int)),this,SLOT(chan_connected(int))); connect(mmnClientThread[i]->mmnClient,SIGNAL(disconnected(int)),this,SLOT(chan_disconnected(int))); connect(this,SIGNAL(disconnectClient()),mmnClientThread[i]->mmnClient,SLOT(disconnectFromServer())); //тут я буду слать сигнал потоку что бы он отключил сокет mmnClientThread[i]->start(); //запускаю поток } }
void CEC::stopClient() { for(int i=0;i<1;i++) { if(mmnClientThread[i]) { emit(disconnectClient()); //шлю сигнал сокету в потоке на принудительное отключение disconnect(mmnClientThread[i]->mmnClient); //отключаю все сигналы/слоты mmnClientThread[i]->quit(); //закрываю поток mmnClientThread[i]->wait(); //жду delete mmnClientThread[i]; //удаляю поток mmnClientThread[i] = NULL; } } }
До этого я не слал сигнал в поток клиента, и иногда прога вылетала, так как сокет успевал подать сигнал о приеме данных, но сам поток уже уничтожен. После внесения этой коррективы вроде бага на наболюдаю. Подскажите с точки зрения Qt грамотно ли я прибиваю сокет/поток?
|
|
|
1000
|
Qt / Общие вопросы / Регулярные выражения, просветите пжлста.
|
: Май 15, 2011, 13:22
|
Посмотрел документацию по регулярным выражениям. Но не понял как мне реализовать следующее: Есть строка, в которой нужно найти все слова, которые находятся между символами '%', или за одним символом %. Затем получить список этих слов. Как создать регулярное выражение что бы сработал поиск?
|
|
|
|
|