proxyWidget->setWidget(stackedWidget); scene->addItem(proxyWidget);
//view->resize(200,200);
view->setRenderHints(QPainter::Antialiasing | QPainter::SmoothPixmapTransform); //view->setBackgroundBrush(QPixmap(―:/No-Ones-Laughing-3.jpg‖)); view->setCacheMode(QGraphicsView::CacheBackground);
view->setViewportUpdateMode(QGraphicsView::BoundingRectViewportUpdate); view->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff); view->setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff); view->setBackgroundBrush(QColor(―#151C28″));// }
====================================================================== 事件原型申明中的类型定义不能加默认值
============================================ QPainterPath 画出的图形会闪烁的问题: 用下面的写法画出的图形会闪烁 class MyClass: public QWidget {
public:
MyClass(QWidget*); private:
QPainterPath* route;
void paintEvent(QPaintEvent*e); };
MyClass::MyClass() {
route = new QPainterPath();
}
void MyClass::paintEvent( QPaintEvent*e) {
QPainter *painter = new QPainter(this); //画校正图形
int insideR = 30; int outsideR = 50;
QColor insideColor(237,29,12); //内圆线条颜色 QColor outSideColor(237,29,12); //外圆线条颜色
QColor lineColor(237,29,12); //直线颜色
QColor insideBrushColor(255,0,0,25);//内圆画刷颜色,最后的参数代表透明度( 0(完全透明)-100(不透明) )
QColor outsideBrushColor(255,0,0,50);//外圆画刷颜色,最后的参数代表透明度( 0(完全透明)-100(不透明) )
//QPainterPath path;
route->moveTo(insideR,0); route->lineTo(outsideR,0);
route->arcTo(0-outsideR,0-outsideR,outsideR*2,outsideR*2,0,180); route->lineTo(0-insideR,0);
route->arcTo(0-insideR,0-insideR,insideR*2,insideR*2,0,180); route->moveTo(0-insideR,0);
route->lineTo(0-outsideR,0);
route->arcTo(0-outsideR,0-outsideR,outsideR*2,outsideR*2,180,180); route->lineTo(insideR,0);
route->arcTo(0-insideR,0-insideR,insideR*2,insideR*2,180,180); painter->setPen(Qt::NoPen);
painter->setBrush(outsideBrushColor); painter->drawPath(*route); painter->setBrush(Qt::NoBrush); painter->setPen(outSideColor);
painter->drawEllipse( QPointF(0,0),outsideR,outsideR ); painter->setBrush(insideBrushColor); painter->setPen(insideColor);
painter->drawEllipse( QPointF(0,0),insideR,insideR ); painter->setPen(lineColor);
QPoint p1(0, 0- outsideR – 10 ); QPoint p2(0, outsideR + 10 ); painter->drawLine(p1,p2); painter->rotate(90); painter->drawLine(p1,p2); painter->rotate(-90); delete painter; }
如下用下面的写法则不会闪烁:
void MyClass::paintEvent( QPaintEvent*e) {
QPainter *painter = new QPainter(this); //画校正图形 int insideR = 30;
int outsideR = 50;
QColor insideColor(237,29,12); //内圆线条颜色 QColor outSideColor(237,29,12); //外圆线条颜色 QColor lineColor(237,29,12); //直线颜色
QColor insideBrushColor(255,0,0,25);//内圆画刷颜色,最后的参数代表透明度( 0(完全透
明)-100(不透明) )
QColor outsideBrushColor(255,0,0,50);//外圆画刷颜色,最后的参数代表透明度( 0(完全透明)-100(不透明) ) QPainterPath path; path.moveTo(insideR,0); path.lineTo(outsideR,0);
path.arcTo(0-outsideR,0-outsideR,outsideR*2,outsideR*2,0,180); path.lineTo(0-insideR,0);
path.arcTo(0-insideR,0-insideR,insideR*2,insideR*2,0,180); path.moveTo(0-insideR,0);
path.lineTo(0-outsideR,0);
path.arcTo(0-outsideR,0-outsideR,outsideR*2,outsideR*2,180,180); path.lineTo(insideR,0);
path.arcTo(0-insideR,0-insideR,insideR*2,insideR*2,180,180); painter->setPen(Qt::NoPen);
painter->setBrush(outsideBrushColor); painter->drawPath(path); painter->setBrush(Qt::NoBrush); painter->setPen(outSideColor);
painter->drawEllipse( QPointF(0,0),outsideR,outsideR ); painter->setBrush(insideBrushColor); painter->setPen(insideColor);
painter->drawEllipse( QPointF(0,0),insideR,insideR ); painter->setPen(lineColor);
QPoint p1(0, 0- outsideR – 10 ); QPoint p2(0, outsideR + 10 ); painter->drawLine(p1,p2); painter->rotate(90);
painter->drawLine(p1,p2); painter->rotate(-90); delete painter; }
================================================ 如何让QT程序只运行一次:
以下代码在Ubuntu,win下测试通过: #include
int main(int argc, char *argv[])
{
QApplication app(argc, argv);
QSystemSemaphore sema(―JAMKey‖,1,QSystemSemaphore::Open); sema.acquire();//在临界区操作共享内存 SharedMemory QSharedMemory mem(―SystemObject‖);//全局对象名 if (!mem.create(1))//如果全局对象以存在则退出 {
qDebug()< sema.release();//如果是Unix系统,会自动释放。 return 0; } sema.release();//临界区 QLabel label(―Demo‖); label.show(); return app.exec();//释放栈上的mem对象。 } ========================================= 打印当前代码行所在的文件与行: qDebug()<<‖所在文件:‖< pro文件中,请注意 ―RESOURCES += ―不可写成‖RESOURCES = ―; ============================================================ *.pro : unix: DEFINES += __LINUX__ #ifdef __LINUX__ … #else … #endif ========================================== 取得信号对象指针: QObject * QObject::sender() const QToolButton* toolBtn = static_cast =========================================== 函数申明后面带有const 的函数,函数体里所调用的函数的申明后面肯定也要带有 const 否则,编译不过 =================================== 请教如何在Qt的pro文件中定义字符串宏 在qtcentre中一位高人的方法得到实现: DEFINES += SHARE_DIR=\\\\\\‖字符串\\\\\\‖ ============================================================== 如果使用OObject::tr(―你好‖)对汉字进行赋值,但使用 qDebug()打印时出现乱码,有可能是*.cpp文件编码 有误,请把*.cpp文件编码改为UTF-8编码; =================================== error: new types may not be defined in a return type error: return type specification for constructor invalid 请检查类定义后有没加‖;‖ ================================================ win下电脑待机方法: static HANDLE hToken; static TOKEN_PRIVILEGES tp; static LUID luid; if(::OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES|TOKEN_QUERY, &hToken)) { ::LookupPrivilegeValue(NULL,SE_SHUTDOWN_NAME,&luid); tp.PrivilegeCount=1; tp.Privileges[0].Luid =luid; tp.Privileges[0].Attributes =SE_PRIVILEGE_ENABLED; ::AdjustTokenPrivileges(hToken,false,&tp,sizeof(TOKEN_PRIVILEGES),NULL,NULL); } ::SetSystemPowerState(true,true); ============================== 改变QMessageBox的大小: 创建一个QMessageBox: QMessageBox msgBox(this); msgBox.setWindowTitle(tr(―MailBox Location‖)); msgBox.setInformativeText(tr(―You must ….. and so on and so forth‖)); 像这样改变它的大小: 1). msgbox.setGeometry ( int x, int y, int w, int h ) 2). msgbox.resize(int w, int h) 结果什么都没有发生。 原因:QMessageBox::showEvent() 强制将其大小改变成了QT认为比较合适的大小。要改变它的大小可使用下面这种方法