ПУСТО

среда, 19 октября 2016 г.

Разница в определениях в С "char const *" и "const char *"

Есть простое мнемоническое правило:
Прочитайте определение указателя справа на лево читая слово const как константный или константа, а символ "*" как указатель.

Например:  

char const * p; //указатель на константый char
char * const p; //константный указатель на char


"простой" указатель

char * p;



указатель на константу

const char * p;
char const * p;


константный (неизменный) указатель

char * const p;


константный указатель на константу

const char * const p;

среда, 20 апреля 2016 г.

Копирование скрипта во фрейм

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<iframe src="" id="d44" scrolling="no" width="250px" height="150px"></iframe>
<div id="d33">
<script type="text/javascript">
function myFyn()
{
 alert('123');
}
</div>
<script>
var d, g, f = document.getElementById('d44'); 
(d = f.contentWindow.document).open();
g=document.getElementById('d33').innerHTML;
d.write(g);
d.close();
document.getElementById('d33').innerHTML='';
</script>
Такое решение, по своей сути не является полным, тут скрипт выполнится дважды. Один раз в div с id=d33, а второй во фрейме после того как он будет туда скопирован. Но для некоторых решений это допустимо.

пятница, 2 октября 2015 г.

Qt - контекстное меню для виджетов

Можно наследовать виджет и переопределить виртуальную функцию

1
2
3
4
5
6
7
8
9
10
11
12
13
14
...
protected:
virtual void contextMenuEvent(QContextMenuEvent * event);
...
 
void myWidget::contextMenuEvent(QContextMenuEvent * event)
{
    QMenu menu(this);
    menu.addAction(QPixmap("C:\\Qt\\pro\\popupmenu-build-desktop\\debug\\ico.png"), "ShowMessage", this, SLOT(msg()));
    menu.addAction("About Qt", qApp, SLOT(aboutQt()));
    menu.addSeparator();
    menu.addAction("Exit", qApp, SLOT(qApp->exit()));
    menu.exec(event->globalPos());
}

Можно подобно, через QAction
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
...
protected:
virtual void contextMenuEvent(QContextMenuEvent * event);
...
 
void myWidget::contextMenuEvent(QContextMenuEvent * event)
{
  QMenu * menu = new QMenu();
 
  if (bTheOpen)
  {
   QAction * ActOpenBrowser=new QAction(tr("Открыть в браузере"), menu);
   ActOpenBrowser->setStatusTip(tr("Это подсказка в StatusBar"));
   ActOpenBrowser->setIcon(QIcon(":/myprog/icons/32_browser.png"));
   connect(ActOpenBrowser,SIGNAL(triggered()),this,SLOT(slotOpenBrowser()));
   menu->addAction(ActOpenBrowser);
  
  if (!menu->isEmpty())
  {
   menu->exec(event->globalPos());
  }
  delete menu
}

Можно прицепить меню, к уже существующему виджету, не наследуя его
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include <QApplication>
#include <QLineEdit>
#include <QAction>
 
int main(int argc, char *argv[])
{
 QApplication a(argc, argv);
 QLineEdit le;
 le.show();
 le.addAction(new QAction(QObject::tr("qwe"),&le));
 le.addAction(new QAction(QObject::tr("asd"),&le));
 le.setContextMenuPolicy(Qt::ActionsContextMenu);
  
 return a.exec();
}

Есть еще вариант того же, но с обработчиком контекстного меню, через сигнал
В приведенном ниже примере, в классе TabWidget (наследнике от QTabWidget) устанавливается контекстное меню на ярлыки вкладок (на элемент QTabBar)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
TabWidget::TabWidget(QWidget * parent):QTabWidget(parent)
{
ActClose = new QAction(tr("Close"),this);
connect(ActClose,SIGNAL(triggered()),this,SLOT(slotClose()));
QTabBar * tb=tabBar();
tb->setContextMenuPolicy(Qt::CustomContextMenu);
connect(tb, SIGNAL(customContextMenuRequested(const QPoint &)), SLOT(slotShowContextMenuTabBar(const QPoint &)));
}
 
void TabWidget::slotShowContextMenuTabBar(const QPoint &point)
{
    if (point.isNull()) return;
    QTabBar * tb=tabBar();
    int tabIndex = tb->tabAt(point); // Индекс - на какой вкладке вызвали меню
  
    if (tabIndex!=currentIndex()) setCurrentIndex(tabIndex);
 
 QMenu menu(this);
 menu.addAction(ActClose);
  
 menu.exec(tb->mapToGlobal(point));
}
void TabWidget::slotClose(void)
{
 removeTab(currentIndex());
}