LINUX.ORG.RU

Окошки в QT


0

2

Уважаемые форумчане, кто как подскажет вариант реализации сего механизма в QT

1) Есть главное окно QMainWindow 2) есть дочерние окна, а вот какие они подскажите..

Требуется чтобы были реализованы следующие плюшки

1) окна модальны по отношению к главному 2) для сенсорных экранов для удобства как реализовать кнопку изменения окна которая находится в правом нижнем углу в форме такой стрелочки за которую удобно таскать, 3) как сделать чтобы дочерние окна как бы были прилеплены к главному т.е при перемещении главного окна, дочернее окно так же следовало за ним, была как бы иллюзия что дочернее окно находится в рабочем пространстве главного.. 4) убрать у дочерних окон верхний заголовок, как опция.



Последнее исправление: grigoreo (всего исправлений: 2)

Во-первых, Qt.

Во-вторых, вообще не понятно, что именно хочется получить в итоге. Почему это должны быть именно окна, а не виджеты, например (у них как раз нет заголовка).
При этом они будут «прилеплены» к главному окну и будут перемещаться вместе с ним, да еще и останутся модальными, если поиграть с их порядком.
Про кнопку в правом _нижнем_ углу совсем ничего не понятно.

Если все же нужны окна, тогда стоит посмотреть вот этот примерчик http://doc.qt.nokia.com/4.7/mainwindows-mdi.html
Убрать верхний заголовок можно, передав Qt::FramelessWindowHint в качестве одного из WindowFlags

trex6 ★★★★★
()
Ответ на: комментарий от trex6

Про кнопку в правом _нижнем_ углу совсем ничего не понятно.

ну эта штука присутствует в statusBar , весь statusBar не нужен а вот кнопочка бы пригодилась(она так и зовется кнопка изменения размеров окна)

grigoreo
() автор топика
Ответ на: комментарий от grigoreo

Понял. Нигда на тачксринах подобных опций (изменение размеров окна) не встречал. Можно попробовать посмотреть как это сделано в тач версиях KDE/Gnome/Unity/что-то-там-еще.

trex6 ★★★★★
()
Ответ на: комментарий от r2d2

Задолбали же школьники, не знают C++, не понимают ООП и, самое простое, не могут даже осилить название инструмента которым пользуются.

Пусть банят хоть сто раз, но:

Qt Qt Qt Qt Qt Qt Qt Qt Qt Qt Qt Qt

Qt Qt Qt Qt Qt Qt Qt Qt Qt Qt Qt Qt

Qt Qt Qt Qt Qt Qt Qt Qt Qt Qt Qt Qt

Qt Qt Qt Qt Qt Qt Qt Qt Qt Qt Qt Qt

anonymous
()
Ответ на: комментарий от trex6

Во-вторых, вообще не понятно, что именно хочется получить в итоге

ну как бы ничего сверхъестественного , дочерние окна это те же диалоговые окна ввода настроек или каких то данных, просто хочется чтобы при перетаскивании окна все добро таскалось вместе

grigoreo
() автор топика
Ответ на: комментарий от grigoreo

Если окна модальные по отношению к главному, то под воздействием чего MainWindow будет перемещаться?

trex6 ★★★★★
()
Ответ на: комментарий от trex6

Если окна модальные по отношению к главному, то под воздействием чего MainWindow будет перемещаться?

ну к примеру сижу в Fedore под Gnome вызываю модальное из Майна, могу Майн за голову таскать по раб столу

grigoreo
() автор топика
Ответ на: комментарий от trex6

тогда стоит посмотреть вот этот примерчик http://doc.qt.nokia.com/4.7/mainwindows-mdi.html

тогда встречный вопрос , на самом Майне будет лежать многостраничный виджет с закладками, так вот получится это все совместить модальность и MDI интерфейс

grigoreo
() автор топика
Ответ на: комментарий от grigoreo

Не уверен.
Если не сработает, тогда отлавливай перемещение MainWindow, после этого шли сигнал о смещении. Диалоги подписываешь на этот сигнал. Но, скорее всего, будет небольшая задержка при смещении диалогов.

trex6 ★★★★★
()
Ответ на: комментарий от trex6

т.е извращаться не стоит надо остановится на QDialogs просто довести до ума все исключения...?

grigoreo
() автор топика

_Не_ используй MDI. Забудь даже о таком акрониме.

1. QWidget.windowModality. Странное требование, учитывая возможность тягать, но, если WM позволяет..
2. QSizeGrip
3. Слот-сигнал - самое простое. Описано выше.
4. Обрати внимание на доку к QWidget и Qt::WindowFlags.

schizoid ★★★
()
Ответ на: комментарий от schizoid

спасибо по пунктам все понятно, а подскажите как в Qt в слоте узнать какой виджет послал сигнал?

grigoreo
() автор топика
Ответ на: комментарий от grigoreo

как в Qt в слоте узнать какой виджет послал сигнал?

QObject::sender()

Но им не рекомендуется пользоваться без особой надобности даже в самой доке. Все нужные данные лучше передавать через параметры самого сигнала (слота). Если неизбежно, то посмотри в сторону QSignalMapper.

schizoid ★★★
()
Ответ на: комментарий от grigoreo

Привести sender() к нужному типу

// Внутри слота:
QAction * action = qobject_cast<QAction *>(sender());
if(action) // Чтобы увериться, что приведение прошло нормально.
{
    // И дальше работаешь с action.
}
schizoid ★★★
()
Ответ на: Привести sender() к нужному типу от schizoid

а можно еще один вопрос?

есть главное окно MainWindow из пункта меню я вызываю слот в слоте я создаю диалоговое окно потомка QDialog как в конструкторе MyDialog::MyDialog взять свойство x MainWindow , просто MainWindow.x() ругается expected primary-expression before "." token

grigoreo
() автор топика
Ответ на: комментарий от grigoreo

Если я правильно тебя понял, ты пытаешься обратиться к классу MainWindow, а нужно к объекту.

В аргументах конструктора диалога есть QObject * parent. При создании диалога нужно явно указывать родителя: dialog = new MyDialog(mainWindow), тогда внутри конструктора parent приводится (как выше) к типу MainWindow и бери, что хочешь.

Но, опять же, лучше все нужные параметры передавать в конструктор напрямую, через аргументы.

schizoid ★★★
()
Ответ на: комментарий от schizoid

Да именно так все получилось, тогда вопрос как следствие, в конструкторе parent вроде как используется , а если у этого дочернего окна есть другие методы , то как сделать чтобы и там можно было получать этот parent...?

grigoreo
() автор топика
Ответ на: комментарий от grigoreo

У QObject вообще и QWidget в частности есть свойство parent(), описано в доке по QObject.

Но для его использования нужно не забыть в конструкторе вызывать конструктор предка с передачей этого параметра:

MyDialog::MyDialog(QWidget * parent)
    : QDialog(parent) //  <---- Вызов конструктора предка.
{
    //...
}

schizoid ★★★
()
Ответ на: комментарий от schizoid

пардон, есть вот такой кусок кода

>QTableWidgetItem* ti;
>  connectTable->setRowCount(connectTable->rowCount()+1);
>  for (int i=0; i<6; i++) {
>   ti = new QTableWidgetItem("");
>   connectTable->setItem(connectTable->rowCount()-1,i,ti);
>  }
сама таблица состоит из 6 колонок, пытаюсь создать пустые текстовые итемы, но на строке connectTable->setItem(connectTable->rowCount()-1,i,ti); происходит вылет программы..., что я сделал не так?

grigoreo
() автор топика

1) окна модальны по отношению к главному

Через QDialog, вестимо. http://qt-doc.ru/klass-qdialog.html

2) ЕМНИП, в правом нижнем углу эта кнопка находится только тогда, когда во всем окне у тебя есть статус бар. Бери QStatusBar, наследуйся от него, и лепи свой, где поменяешь кнопку.

3) MDI

4) http://how2.org.ua/art/254

Zhbert ★★★★★
()
Ответ на: комментарий от schizoid

вот минимальный код

 
#include <QtGui>

class OptionDialog : public QDialog {
 Q_OBJECT
 public:
  OptionDialog();
 public slots:
  void tableEdit(int, int);
};

 
#include <QtGui>
#include "main.h"

OptionDialog::OptionDialog() {
 QTableWidgetItem* ti;
 QVBoxLayout* vl = new QVBoxLayout;
 setLayout(vl);
 QTableWidget* connectTable = new QTableWidget(1,6);
 vl->addWidget(connectTable);
 for (int i=0; i<6; i++) {
  ti = new QTableWidgetItem("");
  connectTable->setItem(0,i,ti);
 }
 connect(connectTable,SIGNAL(cellChanged(int, int)),SLOT(tableEdit(int, int)));
}

void OptionDialog::tableEdit(int row, int col) {
 QTableWidget* connectTable = qobject_cast<QTableWidget*>(sender());
 int count=0;
 QTableWidgetItem* ti;
 for (int i=0; i<4; i++) if (connectTable->item(connectTable->rowCount()-1,i)->text()!="") count+=1;
 if (count==4) {
  connectTable->setRowCount(connectTable->rowCount()+1);
  for (int i=0; i<6; i++) {
   ti = new QTableWidgetItem("");
//   connectTable->setItem(connectTable->rowCount()-1,i,ti);
  }
 }
}

int main(int argc, char *argv[]) {
 QApplication app(argc, argv);
 OptionDialog mainWin;
 mainWin.show();
 return app.exec();
}

grigoreo
() автор топика
Ответ на: комментарий от grigoreo

Странно это, у меня подобный код не падает даже без выделения столбцов заранее. Попробуй пересобрать проект с нуля (make clean && make).

schizoid ★★★
()
Ответ на: комментарий от grigoreo

Пересобери проект, как выше показано. Иногда бинарники неправильно собираются и используются от разных билдов, поэтому могут падать.

schizoid ★★★
()
Ответ на: комментарий от schizoid

Ничего уже не понимаю почему у тебя работает даже без выделения итемов, а у меня вылетает и при выделении итема, и при обращении к пустому итему (по идее многии писали что вернет пустую текстовую строку у меня сразу вылет), попробовал сейчас под форточкой скомпилить тотже самое...

grigoreo
() автор топика
Ответ на: комментарий от schizoid

попробовал только что — итого тотже вылет

grigoreo
() автор топика
Ответ на: комментарий от schizoid

все было проще, хотя не понимаю почему он при обращению к пустому итему на предмет текста все таки у кого то вылетает, а у кого то нет и просто дает пустую строку, просто при определении итема он вызывает этот же слот и попадает на не выделеный итем ))

grigoreo
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.