小编Ale*_*ger的帖子

用于QWidget的clicked()信号打破了样式表

我想将QWidget-container的clicked()信号连接到我的插槽.所以我写了这段代码:

HPP:

class LinkWidget : public QWidget
{
    Q_OBJECT

public:
    explicit LinkWidget(QWidget * parent = 0 );
    ~LinkWidget();

signals:
    void clicked();

protected:
    void mousePressEvent(QMouseEvent * event ) ;
};
Run Code Online (Sandbox Code Playgroud)

CPP:

LinkWidget::LinkWidget(QWidget * parent) :
    QWidget(parent)
{

}

LinkWidget::~LinkWidget()
{

}

void LinkWidget::mousePressEvent(QMouseEvent * event)
{
    emit clicked();
}
Run Code Online (Sandbox Code Playgroud)

一切正常,但我不能再将样式表分配给这个小部件了:

这样可行:

QWidget * statuspanel = new QWidget(this);
statuspanel->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Fixed);
statuspanel->setMinimumHeight(20);
statuspanel->setMaximumHeight(20);
statuspanel->setStyleSheet("border-bottom: 1px solid rgb(206, 203, 186);"
                           "border-right : 1px solid rgb(206, 203, 186);");
Run Code Online (Sandbox Code Playgroud)

那不是:

LinkWidget * statuspanel = new LinkWidget(this); …
Run Code Online (Sandbox Code Playgroud)

inheritance qt qwidget qtstylesheets

1
推荐指数
1
解决办法
229
查看次数

Waitforsingleobject for event不起作用

主线程:

(是的,我现在停止主线程,我现在真的需要它进行测试,这是测试单元.我将在最后阶段在另一个线程中完成所有这些工作.)

码:

function TFreHolder.GetVersion: TFreHolderVersion;
Var
 Data   : TBArray;
 StrLen : Integer;
begin
 SetLength(Data, 0);

 FFrePro.SendCommand(PROTO_COMVERSION, Data);

 ResetEvent(FAsyncMutex);

 if (WaitForSingleObject(FAsyncMutex, PROTO_COMMANDTIMEOUT) = WAIT_TIMEOUT) Then
  Begin
   ShowMessage('Timeout');
   ResetEvent(FAsyncMutex);
   Exit;
  End;

Result.DType    := BytesToWord(FActivePackage.User.Parameters, 0);
Result.DVersion := BytesToWord(FActivePackage.User.Parameters, 2);
StrLen          := BytesToByte(FActivePackage.User.Parameters, 4);

if StrLen < 32
  then Result.DDesc    := BytesToString(FActivePackage.User.Parameters, 5)
  else Result.DDesc    := BytesToString(FActivePackage.User.Parameters, 4);
Run Code Online (Sandbox Code Playgroud)

在COM端口监视线程中:

procedure TFreHolder.CommandSwitcher(Package: TFreProPackage);
...
Begin
     FActivePackage := Package;
     SetEvent(FAsyncMutex)
End;
...
Run Code Online (Sandbox Code Playgroud)

我总是看到超时消息,但如果我评论Waitforsingleobject我可以看到字节和包来了.

我用这种方式在Constructor中创建了Event:

FAsyncMutex  := CreateEvent(Nil, True, False, 'FRE_EVENT');
Run Code Online (Sandbox Code Playgroud)

我的错是什么?在获取结果之前,我需要等待CommandSwitcher函数的调用.

谢谢.

delphi winapi synchronization

0
推荐指数
1
解决办法
1398
查看次数